/ Hex Artifact Content
Login

Artifact 70de94d2681ea8f677fead0e21fcc39efb6bebb5:


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 31  : pager.c,v 1.31
0350: 31 20 32 30 30 37 2f 30 33 2f 33 30 20 32 30 3a  1 2007/03/30 20:
0360: 34 33 3a 34 32 20 64 72 68 20 45 78 70 20 24 0a  43:42 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 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19b0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
19c0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
19d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1a00: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1a10: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1a20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1a50: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a60: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a70: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a80: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a90: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1aa0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1ab0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1ac0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1ad0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1ae0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1af0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1b00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b10: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
1b30: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
1b40: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
1b50: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
1b60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1b70: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b80: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
1b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1ba0: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
1bb0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
1bc0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
1bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1bf0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
1c00: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
1c10: 20 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20    u8 dirty;     
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e   /* TRUE if we n
1c40: 65 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63  eed to write bac
1c50: 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  k changes */.  u
1c60: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65   Sync journal be
1c90: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69  fore writing thi
1ca0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61  s page */.  u8 a
1cb0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1cd0: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
1ce0: 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61  ck() for this pa
1cf0: 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  ge */.  short in
1d00: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
1d10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d20: 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69   of users of thi
1d30: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
1d40: 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65  r *pDirty, *pPre
1d50: 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69  vDirty;    /* Di
1d60: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 75  rty pages */.  u
1d70: 33 32 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20  32 notUsed;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d90: 20 42 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f   Buffer space */
1da0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1db0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32  HECK_PAGES.  u32
1dc0: 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69   pageHash;.#endi
1dd0: 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  f.  /* pPager->p
1de0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1df0: 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f   page data follo
1e00: 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f  w this header */
1e10: 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74  .  /* Pager.nExt
1e20: 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61  ra bytes of loca
1e30: 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  l data follow th
1e40: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  e page data */.}
1e50: 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  ;../*.** For an 
1e60: 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64  in-memory only d
1e70: 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78  atabase, some ex
1e80: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
1e90: 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75  is recorded abou
1ea0: 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73  t.** each page s
1eb0: 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63  o that changes c
1ec0: 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1ed0: 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c  k.  (Journal fil
1ee0: 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73  es are not.** us
1ef0: 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ed for in-memory
1f00: 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68   databases.)  Th
1f10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f  e following info
1f20: 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64  rmation is added
1f30: 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   to.** the end o
1f40: 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c  f every EXTRA bl
1f50: 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ock for in-memor
1f60: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  y databases..**.
1f70: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
1f80: 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
1f90: 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74  een added direct
1fa0: 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20  ly to the PgHdr 
1fb0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75  structure..** Bu
1fc0: 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20  t then it would 
1fd0: 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61  take up an extra
1fe0: 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72   8 bytes of stor
1ff0: 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48  age on every PgH
2000: 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64  dr.** even for d
2010: 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61  isk-based databa
2020: 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20  ses.  Splitting 
2030: 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62  it out saves 8 b
2040: 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69  ytes.  This.** i
2050: 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73  s only a savings
2060: 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f   of 0.8% but tho
2070: 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61  se percentages a
2080: 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65  dd up..*/.typede
2090: 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  f struct PgHisto
20a0: 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74  ry PgHistory;.st
20b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b  ruct PgHistory {
20c0: 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20  .  u8 *pOrig;   
20d0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61    /* Original pa
20e0: 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72  ge text.  Restor
20f0: 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66  e to this on a f
2100: 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ull rollback */.
2110: 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20    u8 *pStmt;    
2120: 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77   /* Text as it w
2130: 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  as at the beginn
2140: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
2150: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
2160: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
2170: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
2180: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
2190: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
21a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
21b0: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
21c0: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
21d0: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
21e0: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
21f0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
2200: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
2210: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
2220: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
2230: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
2240: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
2250: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
2260: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
2270: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
2280: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
2290: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
22a0: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
22b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
22c0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
22d0: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
22e0: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
22f0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
2300: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
2310: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76  _TO_DATA(P)  ((v
2320: 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a  oid*)(&(P)[1])).
2330: 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f  #define DATA_TO_
2340: 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67  PGHDR(D)  (&((Pg
2350: 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23  Hdr*)(D))[-1]).#
2360: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
2370: 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69  EXTRA(G,P) ((voi
2380: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47  d*)&((char*)(&(G
2390: 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65  )[1]))[(P)->page
23a0: 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50  Size]).#define P
23b0: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
23c0: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
23d0: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
23e0: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
23f0: 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53  ]))[(PGR)->pageS
2400: 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ize+(PGR)->nExtr
2410: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  a])../*.** A ope
2420: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
2430: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2440: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2450: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
2460: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
2470: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
2480: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
2490: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
24a0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
24b0: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
24c0: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
24d0: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
24e0: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
24f0: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
2500: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
2510: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
2520: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
2530: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
2540: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
2550: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
2560: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
2570: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
2580: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
2590: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
25a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
25b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
25c0: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
25d0: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
25e0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
25f0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
2600: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
2610: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
2620: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
2630: 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ully..*/.struct 
2640: 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75  Pager {.  u8 jou
2650: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
2660: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2670: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
2680: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
2690: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
26a0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
26c0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
26d0: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
26e0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2700: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2710: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2720: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2730: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2740: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2750: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2760: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2770: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
2780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2790: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
27a0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
27b0: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
27c0: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
27d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
27e0: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
27f0: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
2800: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
2810: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
2820: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
2830: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
2840: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
2850: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
2860: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2880: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
2890: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
28a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
28c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
28d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
28e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
28f0: 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20  8 full_fsync;   
2900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2910: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68  e F_FULLFSYNC wh
2920: 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  en available */.
2930: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2950: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
2960: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
2970: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
2980: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
2990: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
29a0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
29b0: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
29c0: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29e0: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
29f0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
2a00: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a20: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
2a30: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
2a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
2a50: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a70: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
2a80: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
2a90: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
2aa0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2ab0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
2ac0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
2ad0: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2ae0: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b00: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
2b10: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
2b20: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b40: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
2b50: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
2b60: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
2b70: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b90: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
2ba0: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
2bb0: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
2bc0: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
2bd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2be0: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
2bf0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
2c00: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
2c10: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2c20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2c30: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2c40: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2c50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2c60: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2c80: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
2c90: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
2ca0: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
2cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cc0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2cd0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
2ce0: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
2cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
2d00: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
2d10: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
2d20: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
2d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d40: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
2d50: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
2d60: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
2d70: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2da0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
2db0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2dc0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
2dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
2de0: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
2df0: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
2e00: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
2e10: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
2e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e30: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
2e40: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
2e50: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
2e60: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2e70: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
2e80: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
2e90: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
2ea0: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
2eb0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2ec0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2ed0: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
2ee0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2f10: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
2f20: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  es */.  int nMax
2f30: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2f40: 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65      /* High wate
2f50: 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20  r mark of nPage 
2f60: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
2f90: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
2fa0: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
2fb0: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2fe0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
2ff0: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
3000: 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c    u8 *aInJournal
3010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3020: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
3030: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
3040: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
3050: 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20   u8 *aInStmt;   
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3070: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
3080: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
3090: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
30a0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
30b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
30c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30d0: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
30e0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
30f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3110: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
3120: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
3130: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
3140: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
3150: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
3160: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20  /.  OsFile *fd, 
3170: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
3180: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
3190: 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  ors for database
31a0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   and journal */.
31b0: 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20    OsFile *stfd; 
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
31e0: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
31f0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a  nt subjournal*/.
3200: 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70    BusyHandler *p
3210: 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a  BusyHandler;  /*
3220: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
3230: 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a  te.busyHandler *
3240: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
3250: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
3260: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
3270: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
3280: 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20   *pFirstSynced; 
3290: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
32a0: 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50  free page with P
32b0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30  gHdr.needSync==0
32c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
32d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
32e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
32f0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3300: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
3310: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3320: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3330: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3340: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
3350: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
3360: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3370: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
3380: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3390: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
33a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
33b0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
33c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
33d0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
33e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
33f0: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
3400: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
3410: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
3420: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
3430: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3440: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
3450: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
3460: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
3470: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
3480: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
3490: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
34a0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
34b0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
34c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
34d0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
34e0: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
34f0: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
3500: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
3510: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
3520: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
3530: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
3540: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3550: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3560: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
3570: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
3580: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
3590: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
35a0: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
35b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
35c0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
35d0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
35e0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
35f0: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
3600: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
3610: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3620: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
3630: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
3640: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
3650: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
3660: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3670: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
3680: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78  s */.  void *(*x
3690: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
36a0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
36b0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
36c0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
36d0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
36e0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
36f0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3700: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3710: 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20    int nHash;    
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3730: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
3740: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  er hash table */
3750: 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68  .  PgHdr **aHash
3760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3770: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
3780: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
3790: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64  to PgHdr */.#ifd
37a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
37b0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
37c0: 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78  NT.  Pager *pNex
37d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
37e0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
37f0: 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68 69  of pagers in thi
3800: 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64  s thread */.#end
3810: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
3820: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
3830: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
3840: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
3850: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
3860: 0a 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f  .  u32 iChangeCo
3870: 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  unt;           /
3880: 2a 20 44 62 20 63 68 61 6e 67 65 2d 63 6f 75 6e  * Db change-coun
3890: 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 63 61  ter for which ca
38a0: 63 68 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  che is valid */.
38b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  };../*.** If SQL
38c0: 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
38d0: 6e 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ned then increme
38e0: 6e 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  nt the variable 
38f0: 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20  given in.** the 
3900: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64  argument.*/.#ifd
3910: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
3920: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3930: 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a  R(x)  x++.#else.
3940: 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e  # define TEST_IN
3950: 43 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CR(x).#endif../*
3960: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
3970: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
3980: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
3990: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
39a0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
39b0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
39c0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
39d0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
39e0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
39f0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
3a00: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
3a10: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
3a20: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
3a30: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
3a40: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
3a50: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
3a60: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
3a70: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
3a80: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
3a90: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
3aa0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
3ab0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
3ac0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
3ad0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
3ae0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
3af0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
3b00: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
3b10: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3b20: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
3b30: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
3b40: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
3b50: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
3b60: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
3b70: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
3b80: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
3b90: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
3ba0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
3bb0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
3bc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
3bd0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
3be0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
3bf0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
3c00: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
3c10: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
3c20: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
3c30: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
3c40: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
3c50: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
3c60: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
3c70: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
3c80: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
3c90: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
3ca0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
3cb0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
3cc0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
3cd0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
3ce0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
3cf0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
3d00: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
3d10: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
3d20: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
3d30: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
3d40: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
3d50: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
3d60: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
3d70: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
3d80: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
3d90: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
3da0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
3db0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
3dc0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
3dd0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
3de0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
3df0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3e00: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3e10: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3e20: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3e30: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3e40: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3e50: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
3e60: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
3e70: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3e80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
3e90: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
3ea0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
3eb0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
3ec0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
3ed0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
3ee0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
3ef0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3f00: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3f10: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
3f20: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
3f30: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
3f40: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3f50: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3f60: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3f70: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
3f80: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
3f90: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
3fa0: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
3fb0: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
3fc0: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
3fd0: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
3fe0: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
3ff0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
4000: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
4010: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
4020: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
4030: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
4040: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
4050: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
4060: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
4070: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
4080: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4090: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
40a0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
40b0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
40c0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
40d0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
40e0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
40f0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
4100: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
4110: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
4120: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
4130: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
4140: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
4150: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
4160: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
4170: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
4180: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
41a0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
41b0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
41c0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
41d0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
41e0: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
41f0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
4200: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
4210: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
4220: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
4230: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
4240: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
4250: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
4260: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
4270: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
4280: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
4290: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
42a0: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
42b0: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
42c0: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
42d0: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
42e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
42f0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
4300: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
4310: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
4320: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
4330: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
4340: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
4350: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
4360: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
4370: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
4380: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
4390: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
43a0: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
43b0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
43c0: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
43d0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
43e0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
43f0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
4400: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4410: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4420: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
4430: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
4440: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
4450: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
4460: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
4470: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
4480: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
4490: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
44a0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
44b0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
44c0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
44d0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
44e0: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
44f0: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
4500: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  rn;.    sqlite3D
4510: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
4520: 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20     "REFCNT: %4d 
4530: 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d 33  addr=%p nRef=%-3
4540: 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20  d total=%d\n",. 
4550: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
4560: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
4570: 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50 61   p->nRef, p->pPa
4580: 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  ger->nRef.    );
4590: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
45a0: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
45b0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
45c0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
45d0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
45e0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
45f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
4600: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
4610: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4620: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4630: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4640: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
4650: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
4660: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
4670: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
4680: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
4690: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
46a0: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
46b0: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
46c0: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
46d0: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73  1))==0 );.  aHas
46e0: 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  h = sqliteMalloc
46f0: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
4700: 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48  ])*N );.  if( aH
4710: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
4720: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
4730: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
4740: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
4750: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
4760: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
4770: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4780: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
4790: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
47a0: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
47b0: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
47c0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
47d0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
47e0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
47f0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
4800: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
4810: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4820: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
4830: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
4840: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
4850: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4860: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
4870: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
4880: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
4890: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
48a0: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
48b0: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
48c0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
48d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
48e0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
48f0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
4900: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
4910: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4920: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
4930: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4940: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4950: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4960: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4970: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4980: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
4990: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
49a0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
49b0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
49c0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
49d0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
49e0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
49f0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
4a00: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
4a10: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4a20: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
4a30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4a40: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4a50: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4a60: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29   ac, sizeof(ac))
4a70: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4a80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4a90: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4aa0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4ab0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4ac0: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [3];.  }.  retur
4ad0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
4ae0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4af0: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
4b00: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
4b10: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
4b20: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
4b30: 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63 68  oid put32bits(ch
4b40: 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29  ar *ac, u32 val)
4b50: 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  {.  ac[0] = (val
4b60: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4b70: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4b80: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4b90: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4ba0: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4bb0: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4bc0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4bd0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
4be0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
4bf0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
4c00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
4c10: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
4c20: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4c30: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4c40: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4c50: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4c60: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4c70: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4c80: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4c90: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4ca0: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4cb0: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4cc0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4cd0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4ce0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4cf0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4d00: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4d10: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4d20: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4d30: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4d40: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4d50: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4d60: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4d70: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4d80: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4d90: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4da0: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4db0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4dc0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4dd0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4de0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4df0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4e00: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4e10: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
4e20: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
4e30: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4e40: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4e50: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
4e60: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
4e70: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
4e80: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
4e90: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
4ea0: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
4eb0: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
4ec0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
4ed0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
4ee0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
4ef0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
4f00: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
4f10: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
4f20: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
4f30: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
4f40: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
4f50: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4f60: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4f70: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4f80: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4f90: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4fa0: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4fb0: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4fc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4fd0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4fe0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4ff0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
5000: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
5010: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
5020: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
5030: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
5040: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
5050: 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d  .  if(.    rc2==
5060: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
5070: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
5080: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
5090: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a  =SQLITE_CORRUPT.
50a0: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
50b0: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
50c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
50d0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
50e0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
50f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
5100: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
5110: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
5120: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
5130: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
5140: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
5150: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
5160: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5170: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 20  ned char *pData 
5180: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5190: 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   *)PGHDR_TO_DATA
51a0: 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69  (pPage);.  for(i
51b0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61  =0; i<pPage->pPa
51c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69  ger->pageSize; i
51d0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
51e0: 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69  (hash+i)^pData[i
51f0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
5200: 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hash;.}../*.** T
5210: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
5220: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
5230: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
5240: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
5250: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
5260: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
5270: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
5280: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
5290: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
52a0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
52b0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
52c0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
52d0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
52e0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
52f0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
5300: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
5310: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5320: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
5330: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
5340: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
5350: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
5360: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
5370: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
5380: 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d  || MEMDB || pPg-
5390: 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20  >dirty || .     
53a0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
53b0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
53c0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
53d0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
53e0: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
53f0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
5400: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
5410: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5420: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
5430: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
5440: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5450: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
5460: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
5470: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
5480: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
5490: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
54a0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
54b0: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
54c0: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
54d0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
54e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
54f0: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
5500: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
5510: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
5520: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
5530: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5540: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
5550: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
5560: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
5570: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
5580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5590: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
55a0: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
55b0: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
55c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
55d0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
55e0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
55f0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5600: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5610: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5620: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5630: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5640: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5650: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5660: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5670: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5680: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
5690: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
56a0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
56b0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
56c0: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
56d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
56e0: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
56f0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5700: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
5710: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5720: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5730: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5740: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5750: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5760: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5770: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5780: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5790: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
57a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
57b0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
57c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
57d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
57e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
57f0: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
5800: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5820: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5830: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5840: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5850: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5860: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5870: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5880: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5890: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
58a0: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
58b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
58c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
58d0: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
58e0: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
58f0: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5900: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5910: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5920: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5930: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5940: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5950: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5960: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5970: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5980: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5990: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
59a0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
59b0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
59c0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
59d0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
59e0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
59f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5a00: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5a10: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5a20: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5a30: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5a40: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5a50: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5a60: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5a70: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5a80: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5a90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5aa0: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5ab0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
5ad0: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
5ae0: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5af0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5b10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b20: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5b30: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5b40: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5b50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5b60: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5b70: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5b80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
5b90: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
5ba0: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
5bb0: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
5bc0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
5bd0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
5be0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
5bf0: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
5c00: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5c30: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
5c50: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5c70: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5c90: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
5cb0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
5cc0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
5cd0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5ce0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5cf0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5d00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5d10: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5d20: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5d30: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5d40: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5d50: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5d60: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5d70: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5d80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5d90: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5da0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5dc0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5dd0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5de0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5df0: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
5e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5e10: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
5e20: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
5e30: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
5e40: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5e50: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
5e60: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
5e70: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
5e80: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
5e90: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5ea0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
5eb0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
5ec0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
5ed0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
5ee0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5ef0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
5f00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
5f10: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
5f20: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
5f30: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
5f40: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
5f50: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
5f60: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
5f70: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
5f80: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
5f90: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5fa0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
5fb0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
5fc0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5fd0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
5fe0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
5ff0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6000: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6010: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6020: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6030: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
6040: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
6050: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
6060: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
6070: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
6080: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
6090: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
60a0: 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72  {.  char zHeader
60b0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
60c0: 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e  Magic)+16];.  in
60d0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
60e0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
60f0: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
6100: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
6110: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6120: 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  f;.  }..  rc = s
6130: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6140: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6150: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6160: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6170: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
6180: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
6190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
61a0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
61b0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
61c0: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
61d0: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
61e0: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
61f0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
6200: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
6210: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
6220: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
6230: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
6240: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
6250: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
6260: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
6270: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
6280: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
6290: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
62a0: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
62b0: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
62c0: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
62d0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  */.  memcpy(zHea
62e0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
62f0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6300: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a  nalMagic));.  /*
6310: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
6320: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
6330: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
6340: 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
6350: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6360: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
6370: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
6380: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
6390: 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e  0);.  /* The ran
63a0: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
63b0: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
63c0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
63d0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
63e0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
63f0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6400: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
6410: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6420: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6430: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6440: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6450: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6460: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6470: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6480: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6490: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
64a0: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
64b0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
64c0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
64d0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
64e0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
64f0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6500: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
6510: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
6520: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
6530: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
6540: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
6550: 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66  urnalHdr, sizeof
6560: 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63  (zHeader))).  rc
6570: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6580: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6590: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
65a0: 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20  Header));..  /* 
65b0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
65c0: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
65d0: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
65e0: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
65f0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
6600: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
6610: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6620: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
6630: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6640: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6650: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
6660: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
6670: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6680: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
6690: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
66a0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
66b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
66c0: 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ff-1);.    if( r
66d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
66e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
66f0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6700: 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31  ->jfd, "\000", 1
6710: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6720: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6730: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6740: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6750: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
6760: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
6770: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
6780: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6790: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
67a0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
67b0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
67c0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
67d0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
67e0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
67f0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
6800: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
6810: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
6820: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
6830: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
6840: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
6850: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
6860: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6870: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
6880: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
6890: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
68a0: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
68b0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
68c0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
68d0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
68e0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
68f0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
6900: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6910: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
6920: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
6930: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
6940: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
6950: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
6960: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
6970: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
6980: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
6990: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
69a0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
69b0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
69c0: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
69d0: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
69e0: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
69f0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
6a00: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
6a10: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6a20: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
6a30: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6a50: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
6a60: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
6a70: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
6a80: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
6a90: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
6aa0: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
6ab0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6ac0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
6ad0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6ae0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6af0: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
6b00: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6b10: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6b20: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6b30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6b40: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6b50: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6b60: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6b70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6b80: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
6b90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
6ba0: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
6bb0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6bc0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6bd0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
6be0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
6bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6c00: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
6c10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6c20: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6c30: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6c40: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6c50: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6c60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6c70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6c80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
6c90: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6ca0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6cb0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6cc0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6cd0: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
6ce0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6cf0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
6d00: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
6d10: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
6d20: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
6d30: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
6d40: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
6d50: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
6d60: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
6d70: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
6d80: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
6d90: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
6da0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
6db0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
6dc0: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
6dd0: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
6de0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
6df0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
6e00: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
6e10: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
6e20: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
6e30: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
6e40: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
6e50: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6e60: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
6e70: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
6e80: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6e90: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
6ea0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
6eb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6ec0: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
6ed0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
6ee0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
6ef0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
6f00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
6f10: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
6f20: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
6f30: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
6f40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6f50: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
6f60: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
6f70: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
6f80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6f90: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
6fa0: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
6fb0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
6fc0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
6fd0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
6fe0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
6ff0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
7000: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
7010: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
7020: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
7030: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
7040: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
7050: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
7060: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
7070: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
7080: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
7090: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
70a0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
70b0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
70c0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
70d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
70e0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
70f0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
7100: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
7110: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7120: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
7130: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
7140: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
7150: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
7160: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
7170: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
7180: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
7190: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
71a0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
71b0: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
71c0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
71d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
71e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
71f0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
7200: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
7210: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
7220: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
7230: 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b  int i; .  u32 ck
7240: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
7250: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
7260: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
7270: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
7280: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
7290: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
72a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
72b0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
72c0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
72d0: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
72e0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
72f0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
7300: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
7310: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
7320: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
7330: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
7340: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
7350: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
7360: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7370: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
7380: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
7390: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
73a0: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
73b0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
73c0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
73d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
73e0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
73f0: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
7400: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
7410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7420: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7430: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
7440: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7450: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
7460: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
7470: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
7480: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
7490: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
74a0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
74b0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
74c0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
74d0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
74e0: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
74f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7500: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32  urn rc;..  put32
7510: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7520: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
7530: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
7540: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
7550: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7560: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7570: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
7580: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7590: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
75a0: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
75b0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
75c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
75d0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
75e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
7600: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
7610: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
7620: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
7630: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
7640: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
7650: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
7660: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
7670: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
7680: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
7690: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
76a0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
76b0: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
76c0: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
76d0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
76e0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
76f0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
7700: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
7710: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7720: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7730: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7740: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7750: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7760: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7770: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7780: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7790: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
77a0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
77b0: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72   pPg->inStmt ) r
77c0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
77d0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d   pPg->pPrevStmt=
77e0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74  =0 && pPg->pNext
77f0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67  Stmt==0 );.  pPg
7800: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
7810: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
7820: 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Stmt ){.    pPag
7830: 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76  er->pStmt->pPrev
7840: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Stmt = pPg;.  }.
7850: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
7860: 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74   = pPager->pStmt
7870: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
7880: 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  t = pPg;.  pPg->
7890: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74  inStmt = 1;.}.st
78a0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
78b0: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
78c0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
78d0: 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  {.  if( !pPg->in
78e0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
78f0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53   if( pPg->pPrevS
7900: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7910: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
7920: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50  t->pNextStmt==pP
7930: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
7940: 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74  revStmt->pNextSt
7950: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
7960: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
7970: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7980: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50  Pager->pStmt==pP
7990: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
79a0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
79b0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
79c0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
79d0: 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  xtStmt ){.    as
79e0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
79f0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Stmt->pPrevStmt=
7a00: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7a10: 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65  >pNextStmt->pPre
7a20: 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72  vStmt = pPg->pPr
7a30: 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50  evStmt;.  }.  pP
7a40: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
7a50: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
7a60: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69  mt = 0;.  pPg->i
7a70: 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nStmt = 0;.}../*
7a80: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
7a90: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
7aa0: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
7ab0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
7ac0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
7ad0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
7ae0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
7af0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
7b00: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
7b10: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
7b20: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
7b30: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
7b40: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
7b50: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
7b60: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
7b70: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
7b80: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
7b90: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
7ba0: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
7bb0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
7bc0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
7bd0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
7be0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
7bf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7c00: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
7c10: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
7c20: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
7c30: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
7c40: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
7c50: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
7c60: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
7c70: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70  O_LOCK);.      p
7c80: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
7c90: 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  -1;.      IOTRAC
7ca0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
7cb0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d  , pPager)).    }
7cc0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
7cd0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
7ce0: 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  K;.    pPager->c
7cf0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
7d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7d10: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
7d20: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
7d30: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
7d40: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
7d50: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
7d60: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
7d70: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
7d80: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
7d90: 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73  d.** the error-s
7da0: 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tate..*/.static 
7db0: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
7dc0: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
7dd0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
7de0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
7df0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
7e00: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
7e10: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
7e20: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69  alOpen==0 );.  i
7e30: 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  f( p->state>=PAG
7e40: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
7e50: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
7e60: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
7e70: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
7e80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7e90: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
7ea0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
7eb0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
7ec0: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
7ed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7ee0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
7ef0: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
7f00: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
7f10: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  }.../*.** Unlock
7f20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
7f30: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
7f40: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
7f50: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
7f60: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
7f70: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
7f80: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
7f90: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
7fa0: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
7fb0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
7fc0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7fd0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
7fe0: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
7ff0: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
8000: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
8010: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
8020: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
8030: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
8040: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8050: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
8060: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67  Next;.  if( pPag
8070: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
8080: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d  turn;.  for(pPg=
8090: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
80a0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
80b0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
80c0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
80d0: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
80e0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74   }.  pPager->pSt
80f0: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  mt = 0;.  pPager
8100: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
8110: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
8120: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
8130: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
8140: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
8150: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  0;.  pPager->nHa
8160: 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sh = 0;.  sqlite
8170: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
8180: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
8190: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
81a0: 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20  er->aHash = 0;. 
81b0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
81c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
81d0: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
81e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
81f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
8200: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
8210: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
8220: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
8230: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
8240: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
8250: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
8260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8270: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
8280: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
8290: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
82a0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
82b0: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
82c0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
82d0: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
82e0: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
82f0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
8300: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
8310: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
8320: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
8330: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
8340: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
8350: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
8360: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
8370: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
8380: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
8390: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
83a0: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
83b0: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
83c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
83d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
83e0: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
83f0: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
8400: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
8410: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
8420: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
8430: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
8440: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
8450: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
8460: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
8470: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
8480: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
8490: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
84a0: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
84b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
84c0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
84d0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
84e0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
84f0: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
8500: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
8510: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
8520: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
8530: 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
8540: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
8550: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
8560: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8570: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
8580: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
8590: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
85a0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26  ger->stmtOpen &&
85b0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
85c0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73  iveMode ){.    s
85d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
85e0: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
85f0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
8600: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
8610: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
8620: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  lOpen ){.    if(
8630: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
8640: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
8650: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8660: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
8670: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  fd, 0);.      sq
8680: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
8690: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
86a0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
86b0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
86c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
86d0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
86e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
86f0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
8700: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
8710: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8720: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
8730: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8740: 20 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 72   temporary pager
8750: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
8760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f  journal file sho
8770: 75 6c 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 76  uld.      ** hav
8780: 65 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  e been configure
8790: 64 20 61 73 20 64 65 6c 65 74 65 2d 6f 6e 2d 63  d as delete-on-c
87a0: 6c 6f 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  lose. Otherwise,
87b0: 20 69 74 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   it should still
87c0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6e 20  .      ** be in 
87d0: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  the file system.
87e0: 20 54 68 69 73 20 70 61 67 65 72 20 73 74 69 6c   This pager stil
87f0: 6c 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  l holds a RESERV
8800: 45 44 20 6f 72 20 67 72 65 61 74 65 72 0a 20 20  ED or greater.  
8810: 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74      ** lock on t
8820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8830: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
8840: 20 63 68 61 6e 63 65 20 61 6e 6f 74 68 65 72 20   chance another 
8850: 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
8860: 20 63 6f 75 6c 64 20 63 72 65 61 74 65 20 6f 72   could create or
8870: 20 72 65 6d 6f 76 65 20 61 20 6a 6f 75 72 6e 61   remove a journa
8880: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  l file..      **
8890: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 73 65 20  .      ** These 
88a0: 61 73 73 65 72 74 73 20 61 72 65 20 6e 6f 74 20  asserts are not 
88b0: 76 61 6c 69 64 20 66 6f 72 20 61 73 79 6e 63 68  valid for asynch
88c0: 72 6f 6e 6f 75 73 20 49 2f 4f 20 73 75 63 68 20  ronous I/O such 
88d0: 61 73 20 69 73 20 66 6f 75 6e 64 0a 20 20 20 20  as is found.    
88e0: 20 20 2a 2a 20 69 6e 20 61 73 79 6e 63 2e 74 65    ** in async.te
88f0: 73 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  st.      */.    
8900: 20 20 2f 2a 61 73 73 65 72 74 28 20 73 71 6c 69    /*assert( sqli
8910: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
8920: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8930: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
8940: 70 46 69 6c 65 20 29 3b 2a 2f 0a 20 20 20 20 20  pFile );*/.     
8950: 20 2f 2a 61 73 73 65 72 74 28 20 21 73 71 6c 69   /*assert( !sqli
8960: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
8970: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8980: 29 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 74 65  ) || !pPager->te
8990: 6d 70 46 69 6c 65 20 29 3b 2a 2f 0a 20 20 20 20  mpFile );*/.    
89a0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
89b0: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
89c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
89d0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
89e0: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  zJournal);.     
89f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8a00: 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
8a10: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >aInJournal );. 
8a20: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
8a30: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66  urnal = 0;.    f
8a40: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
8a50: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
8a60: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
8a70: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
8a80: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
8a90: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
8aa0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
8ab0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
8ac0: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
8ad0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
8ae0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8af0: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
8b00: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
8b10: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
8b20: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
8b30: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
8b40: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
8b50: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
8b60: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
8b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
8b80: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
8b90: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
8ba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8bb0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
8bc0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
8bd0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
8be0: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
8bf0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
8c00: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  ){.    rc2 = sql
8c10: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
8c20: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
8c30: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
8c40: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
8c50: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
8c60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8c70: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
8c80: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
8c90: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
8ca0: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
8cb0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
8cc0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
8cd0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
8ce0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
8cf0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
8d00: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
8d10: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
8d20: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
8d30: 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72  e = -1;..  retur
8d40: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
8d50: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
8d60: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
8d70: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
8d80: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
8d90: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
8da0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
8db0: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
8dc0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
8dd0: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
8de0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
8df0: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
8e00: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
8e10: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
8e20: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
8e30: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
8e40: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
8e50: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
8e60: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
8e70: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
8e80: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
8e90: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
8ea0: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
8eb0: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
8ec0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
8ed0: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
8ee0: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
8ef0: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
8f00: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
8f10: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
8f20: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
8f30: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
8f40: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
8f50: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
8f60: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
8f70: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
8f80: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
8f90: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
8fa0: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
8fb0: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
8fc0: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
8fd0: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
8fe0: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
8ff0: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
9000: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
9010: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
9020: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
9030: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
9040: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
9050: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
9060: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
9070: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
9080: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
9090: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
90a0: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
90b0: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
90c0: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
90d0: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
90e0: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
90f0: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
9100: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
9110: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
9120: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
9130: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
9140: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
9150: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
9160: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
9170: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
9180: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
9190: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
91a0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
91b0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
91c0: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
91d0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
91e0: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
91f0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
9200: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
9210: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
9220: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
9230: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
9240: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
9250: 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
9260: 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a  ean(PgHdr*);../*
9270: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
9280: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
9290: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
92a0: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
92b0: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
92c0: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
92d0: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
92e0: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
92f0: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
9300: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
9310: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
9320: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
9330: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
9340: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
9350: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
9360: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
9370: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
9380: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
9390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
93a0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
93b0: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
93c0: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
93d0: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
93e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
93f0: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
9400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9410: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
9420: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
9430: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
9460: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
9470: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
9480: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
9490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
94a0: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
94b0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
94c0: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
94d0: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
94e0: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
94f0: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
9500: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
9510: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
9520: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
9530: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
9540: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
9550: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9560: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
9570: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
9580: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
9590: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
95a0: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
95b0: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
95c0: 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65  >stfd) );.  asse
95d0: 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20  rt( aData );..  
95e0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
95f0: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
9600: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9610: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9620: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
9630: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
9640: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9650: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9660: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
9670: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
9680: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
9690: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
96a0: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
96b0: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
96c0: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
96d0: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
96e0: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
96f0: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
9700: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
9710: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
9720: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
9730: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
9740: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
9750: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
9760: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
9770: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
9780: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
9790: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
97a0: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
97b0: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
97c0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
97d0: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
97e0: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
97f0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
9800: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9810: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
9820: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
9830: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
9840: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
9850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9860: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
9870: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
9880: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
9890: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
98a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
98b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
98c0: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
98d0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
98e0: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
98f0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
9900: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9910: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
9920: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
9930: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
9940: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
9950: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
9960: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
9970: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
9980: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
9990: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
99a0: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
99b0: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
99c0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
99d0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
99e0: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
99f0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
9a00: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
9a10: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9a20: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
9a30: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
9a40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
9a50: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
9a60: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
9a70: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
9a80: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
9a90: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
9aa0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
9ab0: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
9ac0: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20  ot dirty..  **. 
9ad0: 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
9ae0: 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
9af0: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
9b00: 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
9b10: 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
9b20: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
9b30: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
9b40: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
9b50: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9b60: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
9b70: 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
9b80: 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
9b90: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
9ba0: 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
9bb0: 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
9bc0: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
9bd0: 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
9be0: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
9bf0: 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
9c00: 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
9c10: 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
9c20: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
9c30: 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
9c40: 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
9c50: 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
9c60: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e   contents are in
9c70: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
9c80: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
9c90: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20    Otherwise, if 
9ca0: 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  a full ROLLBACK 
9cb0: 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65  occurs after the
9cc0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9cd0: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c  rollback the ful
9ce0: 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20  l ROLLBACK will 
9cf0: 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20  not restore the 
9d00: 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67  page to its orig
9d10: 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  inal.  ** conten
9d20: 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  t.  Two conditio
9d30: 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62  ns must be met b
9d40: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
9d50: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
9d60: 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  ** files. (1) th
9d70: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
9d80: 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  be locked.  (2) 
9d90: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
9da0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70   original.  ** p
9db0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69  age content is i
9dc0: 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
9dd0: 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
9de0: 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
9df0: 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20  t in.  ** cache 
9e00: 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61  or else it is ma
9e10: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
9e20: 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ==0..  */.  pPg 
9e30: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
9e40: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
9e50: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9e60: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9e70: 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30  LUSIVE || pPg!=0
9e80: 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
9e90: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9ea0: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
9eb0: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
9ec0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9ed0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9ee0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
9ef0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
9f00: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
9f10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
9f20: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
9f30: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9f40: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9f50: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9f60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9f70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9f80: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9f90: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9fa0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9fb0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9fc0: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
9fd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
9fe0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
9ff0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
a000: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
a010: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
a020: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
a030: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
a040: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
a050: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
a060: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
a070: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
a080: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
a090: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
a0a0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
a0b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
a0c0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
a0d0: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
a0e0: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
a0f0: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
a100: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
a110: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
a120: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
a130: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
a140: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
a150: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
a160: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
a170: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
a180: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
a190: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
a1a0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
a1b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a1c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
a1d0: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
a1e0: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
a1f0: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
a200: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
a210: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
a220: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
a230: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
a240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
a250: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
a260: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
a270: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
a280: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44  ;.#endif.    COD
a290: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
a2a0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
a2b0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
a2c0: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
a2d0: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
a2e0: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 69 43  alue of Pager.iC
a2f0: 68 61 6e 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20  hangeCount */.  
a300: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
a310: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  .      pPager->i
a320: 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65  ChangeCount = re
a330: 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
a340: 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 24);.    }.  }
a350: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a360: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
a370: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
a380: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
a390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
a3a0: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
a3b0: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
a3c0: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
a3d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a3e0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
a3f0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
a400: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
a410: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
a420: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
a430: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a440: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
a450: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
a460: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a470: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
a480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
a490: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
a4a0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
a4b0: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
a4c0: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
a4d0: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
a4e0: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
a4f0: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
a500: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
a510: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
a520: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
a530: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
a540: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
a550: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
a560: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
a570: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
a580: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
a590: 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61  master(const cha
a5a0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
a5b0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
a5c0: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
a5d0: 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d  OsFile *master =
a5e0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   0;.  char *zMas
a5f0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
a600: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
a610: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a620: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
a630: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
a640: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
a650: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a660: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
a670: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a680: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
a690: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
a6a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
a6b0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
a6c0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
a6d0: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
a6e0: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
a6f0: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72  erence..  */.  r
a700: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
a710: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
a720: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69  r, &master);.  i
a730: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a740: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a750: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
a760: 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d  open = 1;.  rc =
a770: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a780: 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73  ze(master, &nMas
a790: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
a7a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a7b0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a7c0: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
a7d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
a7e0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
a7f0: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
a800: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
a810: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
a820: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
a830: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
a840: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
a850: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
a860: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  teMalloc() and p
a870: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
a880: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
a890: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
a8a0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
a8b0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
a8c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a8d0: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
a8e0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
a8f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a900: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
a910: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a920: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
a930: 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65  ite3OsRead(maste
a940: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
a950: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
a960: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
a970: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a980: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a990: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
a9a0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
a9b0: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
a9c0: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
a9d0: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
a9e0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
a9f0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
aa00: 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29  ists(zJournal) )
aa10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
aa20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
aa30: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
aa40: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aa50: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
aa60: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
aa70: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
aa80: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
aa90: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
aaa0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
aab0: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
aac0: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
aad0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
aae0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
aaf0: 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c   OsFile *journal
ab00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
ab10: 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63  t c;..        rc
ab20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
ab30: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
ab40: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
ab50: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ab60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ab70: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
ab80: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
ab90: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
aba0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
abb0: 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  al(journal, &zMa
abc0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
abd0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
abe0: 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (&journal);.    
abf0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ac00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ac10: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
ac20: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
ac30: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
ac40: 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73  asterPtr!=0 && s
ac50: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
ac60: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
ac70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
ac80: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
ac90: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
aca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
acb0: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
acc0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
acd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ace0: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
acf0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ad00: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ad10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
ad20: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
ad30: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
ad40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
ad50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
ad60: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
ad70: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
ad80: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
ad90: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
ada0: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
adb0: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
adc0: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
add0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
ade0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
adf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ae00: 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 4d 61  ..#if 0./*.** Ma
ae10: 6b 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e  ke every page in
ae20: 20 74 68 65 20 63 61 63 68 65 20 61 67 72 65 65   the cache agree
ae30: 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
ae40: 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72   disk.  In other
ae50: 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61   words,.** rerea
ae60: 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65  d the disk to re
ae70: 73 65 74 20 74 68 65 20 73 74 61 74 65 20 6f 66  set the state of
ae80: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
ae90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
aea0: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
aeb0: 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69   rollback in whi
aec0: 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64  ch some of the d
aed0: 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61  irty cache.** pa
aee0: 67 65 73 20 68 61 64 20 6e 65 76 65 72 20 62 65  ges had never be
aef0: 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  en written out t
af00: 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64  o disk.  We need
af10: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
af20: 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65  e.** cache conte
af30: 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73 69 65  nt and the easie
af40: 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61  st way to do tha
af50: 74 20 69 73 20 74 6f 20 72 65 72 65 61 64 20 74  t is to reread t
af60: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a  he old content.*
af70: 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  * back from the 
af80: 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
af90: 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64  int pager_reload
afa0: 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
afb0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
afc0: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
afd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72  SQLITE_OK;.  for
afe0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
aff0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
b000: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
b010: 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 70 50 61  char *zBuf = pPa
b020: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
b030: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
b040: 74 6f 72 61 67 65 20 66 6f 72 20 6f 6e 65 20 70  torage for one p
b050: 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  age */.    if( !
b060: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
b070: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
b080: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
b090: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
b0a0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ize ){.      rc 
b0b0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
b0c0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
b0d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
b0e0: 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29  4)(pPg->pgno-1))
b0f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
b100: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b110: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b120: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
b130: 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
b140: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
b150: 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52     }.      PAGER
b160: 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48 20  TRACE3("REFETCH 
b170: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
b180: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
b190: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
b1a0: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
b1b0: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  ;.      CODEC1(p
b1c0: 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67  Pager, zBuf, pPg
b1d0: 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20  ->pgno, 2);.    
b1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
b1f0: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61  set(zBuf, 0, pPa
b200: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
b210: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
b220: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
b230: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
b240: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
b250: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
b260: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
b270: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
b280: 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  Pg), zBuf, pPage
b290: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
b2a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b2b0: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
b2c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
b2d0: 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67  initer(pPg, pPag
b2e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
b2f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b300: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
b310: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
b320: 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
b330: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
b340: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
b350: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
b360: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
b370: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
b380: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
b390: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
b3a0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
b3b0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
b3c0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69   }.  pPager->pDi
b3d0: 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  rty = 0;.  retur
b3e0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
b3f0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
b400: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
b410: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
b420: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
b430: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
b440: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
b450: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
b460: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
b470: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61   int nPage){.  a
b480: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
b490: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
b4a0: 55 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72  USIVE );.  retur
b4b0: 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  n sqlite3OsTrunc
b4c0: 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
b4d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b4e0: 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a  *(i64)nPage);.}.
b4f0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
b500: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
b510: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
b520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b530: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
b540: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
b550: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
b560: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
b570: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
b580: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
b590: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
b5a0: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
b5b0: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
b5c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
b5d0: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
b5e0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
b5f0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
b600: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
b610: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
b620: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
b630: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
b640: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b650: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
b660: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
b670: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
b680: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
b690: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
b6a0: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
b6b0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
b6c0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
b6d0: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
b6e0: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
b6f0: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
b700: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
b710: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
b720: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
b730: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
b740: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
b750: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
b760: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
b770: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
b780: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b790: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b7a0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
b7b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
b7c0: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
b7d0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
b7e0: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
b7f0: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
b800: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
b810: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
b820: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
b830: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
b840: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
b850: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
b860: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
b870: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
b880: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
b890: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
b8a0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
b8b0: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
b8c0: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
b8d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b8e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
b8f0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
b900: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
b910: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
b920: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
b930: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
b940: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
b950: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
b960: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
b970: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
b980: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
b990: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
b9a0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
b9b0: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
b9c0: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
b9d0: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
b9e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
b9f0: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
ba00: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
ba10: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
ba20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
ba30: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
ba40: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
ba50: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
ba60: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
ba70: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
ba80: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
ba90: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
baa0: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
bab0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
bac0: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
bad0: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
bae0: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
baf0: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
bb00: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
bb10: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
bb20: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
bb30: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
bb40: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
bb50: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
bb60: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
bb70: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
bb80: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
bb90: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
bba0: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
bbb0: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
bbc0: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
bbd0: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
bbe0: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
bbf0: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
bc00: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
bc10: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
bc20: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
bc30: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
bc40: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
bc50: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
bc60: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
bc70: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
bc80: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
bc90: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
bca0: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
bcb0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
bcc0: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
bcd0: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
bce0: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
bcf0: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
bd00: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
bd10: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
bd20: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
bd30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
bd40: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
bd50: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
bd60: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
bd70: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
bd80: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
bd90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
bda0: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
bdb0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
bdc0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
bdd0: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
bde0: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
bdf0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
be00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
be10: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
be20: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
be30: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
be40: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
be50: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
be60: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
be70: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
be80: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
be90: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
bea0: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
beb0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
bec0: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
bed0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
bee0: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
bef0: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
bf00: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
bf10: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
bf20: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
bf30: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
bf40: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
bf50: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
bf60: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
bf70: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
bf80: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
bf90: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
bfa0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bfb0: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 69 36  int isHot){.  i6
bfc0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
bfd0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bfe0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bff0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
c000: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
c010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c020: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
c030: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
c040: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c060: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
c070: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
c080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c090: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
c0a0: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
c0b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0d0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
c0e0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
c0f0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
c100: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
c110: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
c120: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
c130: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
c140: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
c150: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
c160: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
c170: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
c180: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
c190: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
c1a0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
c1b0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
c1c0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c1d0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
c1e0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
c1f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
c200: 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
c210: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
c220: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
c230: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c240: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
c250: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
c260: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
c270: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
c280: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c290: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
c2a0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
c2b0: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
c2c0: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
c2d0: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
c2e0: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
c2f0: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
c300: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
c310: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
c320: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
c330: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
c340: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
c350: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
c360: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c370: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
c380: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
c390: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
c3a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
c3b0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
c3c0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
c3d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c3e0: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
c3f0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
c400: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
c410: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
c420: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
c430: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  0);.  pPager->jo
c440: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
c450: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
c460: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
c470: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
c480: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
c490: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
c4a0: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
c4b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
c4c0: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
c4d0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
c4e0: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
c4f0: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
c500: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
c510: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
c520: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
c530: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
c540: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
c550: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
c560: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
c570: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
c580: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
c590: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
c5a0: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
c5b0: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
c5c0: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
c5d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
c5e0: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
c5f0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
c600: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
c610: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
c620: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
c630: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
c640: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c650: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
c660: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c670: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
c680: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c690: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
c6a0: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
c6b0: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
c6c0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
c6d0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
c6e0: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
c6f0: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
c700: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
c710: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
c720: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
c730: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
c740: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
c750: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
c760: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
c770: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
c780: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
c790: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
c7a0: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
c7b0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
c7c0: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
c7d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c7e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
c7f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
c800: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
c810: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
c820: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c830: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
c840: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
c850: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
c860: 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
c870: 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
c880: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
c890: 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
c8a0: 2a 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20 74  ** process. In t
c8b0: 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 73  his case the res
c8c0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c8d0: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
c8e0: 66 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  f.    ** journal
c8f0: 6c 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70 61  led copies of pa
c900: 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
c910: 20 62 65 20 72 65 61 64 20 62 61 63 6b 20 69 6e   be read back in
c920: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  to the cache..  
c930: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c940: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 29  c==0 && !isHot )
c950: 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
c960: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
c970: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
c980: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c990: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c9a0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
c9b0: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
c9c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
c9d0: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
c9e0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
c9f0: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
ca00: 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  's original size
ca10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ca20: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ca30: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
ca40: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
ca50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
ca60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ca70: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
ca80: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ca90: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
caa0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
cab0: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
cac0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
cad0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
cae0: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
caf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cb00: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
cb10: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
cb20: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
cb30: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
cb40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
cb50: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
cb60: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
cb70: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
cb80: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
cb90: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
cba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
cbb0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
cbc0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cbd0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cbe0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cbf0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
cc00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cc10: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
cc20: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
cc30: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
cc40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
cc50: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cc60: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
cc70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cc80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cc90: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
cca0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
ccb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ccc0: 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
ccd0: 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
cce0: 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
ccf0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
cd00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd10: 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
cd20: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
cd30: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
cd40: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
cd50: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
cd60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
cd70: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
cd80: 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
cd90: 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
cda0: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
cdb0: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
cdc0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
cdd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
cde0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cdf0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
ce00: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
ce10: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
ce20: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
ce30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
ce40: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
ce50: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
ce60: 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
ce70: 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
ce80: 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
ce90: 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
cea0: 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
ceb0: 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
cec0: 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
ced0: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
cee0: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
cef0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
cf00: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
cf10: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
cf20: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
cf30: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
cf40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cf50: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
cf60: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
cf70: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
cf80: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
cf90: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
cfa0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
cfb0: 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
cfc0: 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
cfd0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
cfe0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
cff0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
d000: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
d010: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
d020: 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
d030: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
d040: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
d050: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
d060: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
d070: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
d080: 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
d090: 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
d0a0: 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
d0b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
d0c0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
d0d0: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
d0e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
d0f0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
d100: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
d110: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
d120: 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
d130: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
d140: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
d150: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d160: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
d170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
d180: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
d190: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
d1a0: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
d1b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d1c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
d1d0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
d1e0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
d1f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d200: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
d210: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
d220: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23  r->journalOff;.#
d230: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20  ifndef NDEBUG . 
d240: 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a   {.    i64 os_sz
d250: 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  J;.    rc = sqli
d260: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
d270: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73  ager->jfd, &os_s
d280: 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  zJ);.    if( rc!
d290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
d2a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
d2b0: 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20  rt( szJ==os_szJ 
d2c0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
d2d0: 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74   /* Set hdrOff t
d2e0: 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20  o be the offset 
d2f0: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65  just after the e
d300: 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a  nd of the last j
d310: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  ournal.  ** page
d320: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
d330: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
d340: 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69  l-header for thi
d350: 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  s statement.  **
d360: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
d370: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65   written, or the
d380: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
d390: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
d3a0: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
d3b0: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
d3c0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
d3d0: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
d3e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
d3f0: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
d400: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
d410: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
d420: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20   = szJ;.  }.  . 
d430: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
d440: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
d450: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d460: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ize..  */.  if( 
d470: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d480: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
d490: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d4a0: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
d4b0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
d4c0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
d4d0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
d4e0: 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
d4f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
d500: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
d510: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
d520: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
d530: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
d540: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d550: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
d560: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d570: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
d580: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
d590: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
d5a0: 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
d5b0: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
d5c0: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
d5d0: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
d5e0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
d5f0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
d600: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
d610: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
d620: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
d630: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
d640: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
d650: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
d660: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
d670: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
d680: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
d690: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
d6a0: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
d6b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
d6c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
d6d0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
d6e0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
d6f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d700: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d710: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61  >stfd, 0);.    a
d720: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d730: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
d740: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d750: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d760: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
d770: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
d780: 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
d790: 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
d7a0: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
d7b0: 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
d7c0: 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
d7d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d7e0: 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
d7f0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
d800: 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
d810: 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
d820: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
d830: 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
d840: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
d850: 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
d860: 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
d870: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
d880: 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
d890: 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
d8a0: 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
d8b0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
d8c0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
d8d0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
d8e0: 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
d8f0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
d900: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d910: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
d920: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
d930: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
d940: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
d950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d960: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
d970: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
d980: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d990: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
d9a0: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
d9b0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
d9c0: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
d9d0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
d9e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d9f0: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
da00: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
da10: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
da20: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
da30: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
da40: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
da50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
da60: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
da70: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
da80: 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  k;.  }..  while(
da90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
daa0: 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20  Off < szJ ){.   
dab0: 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20   u32 nJRec;     
dac0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dad0: 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
dae0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
daf0: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
db00: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
db10: 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
db20: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
db30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
db40: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
db50: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
db60: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
db70: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
db80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
db90: 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  JRec==0 ){.     
dba0: 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20   nJRec = (szJ - 
dbb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dbc0: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
dbd0: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
dbe0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65  }.    for(i=nJRe
dbf0: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
dc00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
dc10: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
dc20: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
dc30: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
dc40: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
dc50: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
dc60: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
dc70: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
dc80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
dc90: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
dca0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
dcb0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
dcc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
dcd0: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
dce0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
dcf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
dd00: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
dd10: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
dd20: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
dd30: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
dd40: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
dd50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
dd60: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
dd70: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
dd80: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
dd90: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
dda0: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
ddb0: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
ddc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
ddd0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
dde0: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
ddf0: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
de00: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
de10: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
de20: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
de30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
de40: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
de50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
de60: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
de70: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
de80: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
de90: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
dea0: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
deb0: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
dec0: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
ded0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
dee0: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
def0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
df00: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
df10: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
df20: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
df30: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
df40: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
df50: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
df60: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
df70: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
df80: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
df90: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
dfa0: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
dfb0: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
dfc0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
dfd0: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
dfe0: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
dff0: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
e000: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
e010: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
e020: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
e030: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
e040: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e050: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
e060: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
e070: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
e080: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
e090: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
e0a0: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
e0b0: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
e0c0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
e0e0: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
e0f0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
e100: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
e110: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
e120: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
e130: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
e140: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
e150: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
e160: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
e170: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
e180: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
e190: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
e1a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
e1b0: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
e1c0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
e1d0: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
e1e0: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
e1f0: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
e200: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
e210: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
e220: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
e230: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
e240: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
e250: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
e260: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
e270: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
e280: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
e290: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
e2a0: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
e2b0: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
e2c0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
e2d0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
e2e0: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
e2f0: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
e300: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
e310: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
e320: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
e330: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
e340: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
e350: 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
e360: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e370: 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
e380: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
e390: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
e3a0: 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
e3b0: 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
e3c0: 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
e3d0: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
e3e0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
e3f0: 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
e400: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
e410: 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
e420: 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a  c = full_fsync;.
e430: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
e440: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
e450: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
e460: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
e470: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
e480: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
e490: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
e4a0: 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
e4b0: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
e4c0: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
e4d0: 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
e4e0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
e4f0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
e500: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
e510: 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
e520: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
e530: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
e540: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
e550: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
e560: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a  mporary file. .*
e570: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
e580: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e590: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
e5a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e5b0: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
e5c0: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
e5d0: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
e5e0: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
e5f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
e600: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
e610: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
e620: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
e630: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
e640: 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
e650: 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a  (OsFile **pFd){.
e660: 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20    int cnt = 8;. 
e670: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
e680: 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d  zFile[SQLITE_TEM
e690: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69  PNAME_SIZE];..#i
e6a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e6b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
e6c0: 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
e6d0: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
e6e0: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
e6f0: 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  nly */.#endif.  
e700: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
e710: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
e720: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
e730: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e740: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
e750: 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b  (zFile, pFd, 1);
e760: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
e770: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
e780: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
e790: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
e7a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
e7b0: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
e7c0: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
e7d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e7e0: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
e7f0: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
e800: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
e810: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
e820: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
e830: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
e840: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
e850: 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
e860: 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  Get() and is onl
e870: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
e880: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
e890: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
e8a0: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
e8b0: 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  rUnref()..**.** 
e8c0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e8d0: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
e8e0: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
e8f0: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
e900: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
e910: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
e920: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
e930: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
e940: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
e950: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
e960: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
e970: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
e980: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
e990: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
e9a0: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
e9b0: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
e9c0: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
e9d0: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
e9e0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
e9f0: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
ea00: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
ea10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
ea20: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
ea30: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
ea40: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
ea50: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
ea60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ea70: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
ea80: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
ea90: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
eaa0: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
eab0: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
eac0: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
ead0: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
eae0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
eaf0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb10: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
eb20: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
eb30: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
eb40: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
eb50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
eb60: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
eb70: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73    /* Compiler is
eb80: 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20   wrong. This is 
eb90: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
eba0: 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f  ed before use */
ebb0: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20  .  OsFile *fd;. 
ebc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ebd0: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
ebe0: 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
ebf0: 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
ec00: 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
ec10: 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65  y = 0;.  int use
ec20: 4a 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73  Journal = (flags
ec30: 20 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f   & PAGER_OMIT_JO
ec40: 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74  URNAL)==0;.  int
ec50: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66   noReadlock = (f
ec60: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f  lags & PAGER_NO_
ec70: 52 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20  READLOCK)!=0;.  
ec80: 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54  char zTemp[SQLIT
ec90: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d  E_TEMPNAME_SIZE]
eca0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
ecb0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
ecc0: 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
ecd0: 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
ece0: 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
ecf0: 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
ed00: 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
ed10: 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
ed20: 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
ed30: 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
ed40: 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
ed50: 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
ed60: 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
ed70: 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
ed80: 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
ed90: 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
eda0: 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
edb0: 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
edc0: 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
edd0: 65 20 73 65 74 2e 20 49 74 20 77 6f 75 6c 64 20  e set. It would 
ede0: 62 65 20 6e 69 63 65 20 74 6f 20 61 73 73 65 72  be nice to asser
edf0: 74 0a 20 20 2a 2a 20 74 68 61 74 20 54 68 72 65  t.  ** that Thre
ee00: 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73  adData.nAlloc is
ee10: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61   non-zero, but a
ee20: 6c 61 73 20 74 68 69 73 20 62 72 65 61 6b 73 20  las this breaks 
ee30: 74 65 73 74 20 63 61 73 65 73 20 0a 20 20 2a 2a  test cases .  **
ee40: 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f   written to invo
ee50: 6b 65 20 74 68 65 20 70 61 67 65 72 20 64 69 72  ke the pager dir
ee60: 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68  ectly..  */.  Th
ee70: 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
ee80: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
ee90: 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
eea0: 70 54 73 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  pTsd );.#endif..
eeb0: 20 20 2f 2a 20 49 66 20 6d 61 6c 6c 6f 63 28 29    /* If malloc()
eec0: 20 68 61 73 20 61 6c 72 65 61 64 79 20 66 61 69   has already fai
eed0: 6c 65 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  led return SQLIT
eee0: 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66 6f 72 65 20  E_NOMEM. Before 
eef0: 65 76 65 6e 0a 20 20 2a 2a 20 74 65 73 74 69 6e  even.  ** testin
ef00: 67 20 66 6f 72 20 74 68 69 73 2c 20 73 65 74 20  g for this, set 
ef10: 2a 70 70 50 61 67 65 72 20 74 6f 20 4e 55 4c 4c  *ppPager to NULL
ef20: 20 73 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6b   so the caller k
ef30: 6e 6f 77 73 20 74 68 65 20 70 61 67 65 72 0a 20  nows the pager. 
ef40: 20 2a 2a 20 73 74 72 75 63 74 75 72 65 20 77 61   ** structure wa
ef50: 73 20 6e 65 76 65 72 20 61 6c 6c 6f 63 61 74 65  s never allocate
ef60: 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a 70 70 50 61  d. .  */.  *ppPa
ef70: 67 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  ger = 0;.  if( s
ef80: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 46 61 69 6c  qlite3MallocFail
ef90: 65 64 28 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ed() ){.    retu
efa0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
efb0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 66  .  }.  memset(&f
efc0: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 64 29  d, 0, sizeof(fd)
efd0: 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  );..  /* Open th
efe0: 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e 64  e pager file and
eff0: 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e 61   set zFullPathna
f000: 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 6d  me to point at m
f010: 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a 20  alloc()ed .  ** 
f020: 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  memory containin
f030: 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 66  g the complete f
f040: 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69 6e  ilename (i.e. in
f050: 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72 65  cluding the dire
f060: 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20 69  ctory)..  */.  i
f070: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20  f( zFilename && 
f080: 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a  zFilename[0] ){.
f090: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f0a0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
f0b0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
f0c0: 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22  ename,":memory:"
f0d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  )==0 ){.      me
f0e0: 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  mDb = 1;.      z
f0f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
f100: 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29 3b  qliteStrDup("");
f110: 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  .    }else.#endi
f120: 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46  f.    {.      zF
f130: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
f140: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
f150: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
f160: 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50        if( zFullP
f170: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
f180: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
f190: 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a  sOpenReadWrite(z
f1a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66  FullPathname, &f
f1b0: 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20  d, &readOnly);. 
f1c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f1d0: 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
f1e0: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
f1f0: 65 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71  emp(&fd);.    sq
f200: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
f210: 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  ame(zTemp);.    
f220: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d  zFilename = zTem
f230: 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  p;.    zFullPath
f240: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
f250: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
f260: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28  lename);.    if(
f270: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f280: 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65  {.      tempFile
f290: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
f2a0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
f2b0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
f2c0: 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74  re. As part of t
f2d0: 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69  he same allocati
f2e0: 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a  on, allocate.  *
f2f0: 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  * space for the 
f300: 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68  full paths of th
f310: 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72  e file, director
f320: 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20  y and journal . 
f330: 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65   ** (Pager.zFile
f340: 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72  name, Pager.zDir
f350: 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72  ectory and Pager
f360: 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f  .zJournal)..  */
f370: 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68  .  if( zFullPath
f380: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65  name ){.    name
f390: 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75  Len = strlen(zFu
f3a0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20  llPathname);.   
f3b0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
f3c0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  Malloc( sizeof(*
f3d0: 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65  pPager) + nameLe
f3e0: 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20  n*3 + 30 );.    
f3f0: 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63  if( pPager && rc
f400: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
f410: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d       pPager->pTm
f420: 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a  pSpace = (char *
f430: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77  )sqliteMallocRaw
f440: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
f450: 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20  PAGE_SIZE);.    
f460: 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20  }.  }...  /* If 
f470: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
f480: 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
f490: 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
f4a0: 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20  free the memory 
f4b0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  .  ** pointed to
f4c0: 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d   by zFullPathnam
f4d0: 65 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65  e, free the Page
f4e0: 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
f4f0: 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  close the .  ** 
f500: 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20  file. Since the 
f510: 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c  pager is not all
f520: 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20  ocated there is 
f530: 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a  no need to set .
f540: 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65    ** any Pager.e
f550: 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73  rrMask variables
f560: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
f570: 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61  ager || !zFullPa
f580: 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65  thname || !pPage
f590: 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20  r->pTmpSpace || 
f5a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
f5b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
f5c0: 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71  ose(&fd);.    sq
f5d0: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f5e0: 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c  thname);.    sql
f5f0: 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b  iteFree(pPager);
f600: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
f610: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
f620: 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
f630: 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
f640: 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
f650: 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  , FILEHANDLEID(f
f660: 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  d), zFullPathnam
f670: 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
f680: 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
f690: 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68  Pager, zFullPath
f6a0: 6e 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d  name)).  pPager-
f6b0: 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
f6c0: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  ar*)&pPager[1];.
f6d0: 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
f6e0: 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
f6f0: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
f700: 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n+1];.  pPager->
f710: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
f720: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
f730: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72  ameLen+1];.  str
f740: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
f750: 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  ename, zFullPath
f760: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
f770: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f780: 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ry, zFullPathnam
f790: 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  e);..  for(i=nam
f7a0: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
f7b0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
f7c0: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
f7d0: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
f7e0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
f7f0: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
f800: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
f810: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
f820: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
f830: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
f840: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
f850: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
f860: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
f870: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
f880: 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61  d = fd;.  /* pPa
f890: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
f8a0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f8b0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
f8c0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
f8d0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
f8e0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
f8f0: 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
f900: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
f910: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
f920: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f930: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
f940: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
f950: 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
f960: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
f970: 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
f980: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
f990: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
f9a0: 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67  _SIZE;.  /* pPag
f9b0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
f9c0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f9d0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
f9e0: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f9f0: 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
fa00: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78   /* pPager->nMax
fa10: 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Page = 0; */.  p
fa20: 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20  Pager->mxPage = 
fa30: 31 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20 50  100;.  assert( P
fa40: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29  AGER_UNLOCK==0 )
fa50: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
fa60: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
fa70: 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  OCK; */.  /* pPa
fa80: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
fa90: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74  ; */.  pPager->t
faa0: 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69  empFile = tempFi
fab0: 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
fac0: 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
fad0: 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
fae0: 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
faf0: 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
fb00: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
fb10: 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
fb20: 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
fb30: 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
fb40: 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
fb50: 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65  clusiveMode = te
fb60: 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65  mpFile; .  pPage
fb70: 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62  r->memDb = memDb
fb80: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64  ;.  pPager->read
fb90: 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b  Only = readOnly;
fba0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
fbb0: 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
fbc0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
fbd0: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
fbe0: 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61  le || !useJourna
fbf0: 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c  l;.  pPager->ful
fc00: 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d  lSync = (pPager-
fc10: 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20  >noSync?0:1);.  
fc20: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
fc30: 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  t = 0; */.  /* p
fc40: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
fc50: 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ced = 0; */.  /*
fc60: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
fc70: 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
fc80: 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f  >nExtra = FORCE_
fc90: 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61  ALIGNMENT(nExtra
fca0: 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64 7c 7c  );.  assert(fd||
fcb0: 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20 21 6d  memDb);.  if( !m
fcc0: 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61 67  emDb ){.    pPag
fcd0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
fce0: 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72   sqlite3OsSector
fcf0: 53 69 7a 65 28 66 64 29 3b 0a 20 20 7d 0a 20 20  Size(fd);.  }.  
fd00: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  /* pPager->pBusy
fd10: 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a  Handler = 0; */.
fd20: 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
fd30: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
fd40: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
fd50: 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61  sh)); */.  *ppPa
fd60: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69  ger = pPager;.#i
fd70: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
fd80: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
fd90: 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70  MENT.  pPager->p
fda0: 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61  Next = pTsd->pPa
fdb0: 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61  ger;.  pTsd->pPa
fdc0: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65  ger = pPager;.#e
fdd0: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
fde0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
fdf0: 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
fe00: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
fe10: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
fe20: 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
fe30: 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ler(Pager *pPage
fe40: 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r, BusyHandler *
fe50: 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20  pBusyHandler){. 
fe60: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
fe70: 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e  ndler = pBusyHan
fe80: 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  dler;.}../*.** S
fe90: 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
fea0: 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
feb0: 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
fec0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
fed0: 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
fee0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
fef0: 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
ff00: 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
ff10: 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
ff20: 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
ff30: 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
ff40: 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
ff50: 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
ff60: 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
ff70: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
ff80: 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
ff90: 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
ffa0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
ffb0: 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
ffc0: 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
ffd0: 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
ffe0: 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a  e3PagerUnref()..
fff0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
10000 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74 6f  agerSetDestructo
10010 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
10020 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44   void (*xDesc)(D
10030 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20  bPage*,int)){.  
10040 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
10050 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a  tor = xDesc;.}..
10060 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
10070 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
10080 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
10090 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
100a0 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
100b0 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
100c0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
100d0 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
100e0 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
100f0 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  original.** valu
10100 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
10110 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68   a rollback.  Th
10120 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73  e callback gives
10130 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
10140 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75  de.** an opportu
10150 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20  nity to restore 
10160 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f  the EXTRA sectio
10170 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  n to agree with 
10180 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20  the restored.** 
10190 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
101a0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
101b0 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72  etReiniter(Pager
101c0 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
101d0 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
101e0 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
101f0 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
10200 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reinit;.}../*.**
10210 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69   Set the page si
10220 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ze.  Return the 
10230 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68  new size.  If th
10240 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70 61  e suggest new pa
10250 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e  ge.** size is in
10260 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65  appropriate, the
10270 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  n an alternative
10280 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
10290 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65  lected.** and re
102a0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
102b0 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
102c0 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
102d0 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69  ager, int pageSi
102e0 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ze){.  assert( p
102f0 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
10300 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
10310 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
10320 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
10330 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65 72  >memDb && pPager
10340 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
10350 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
10360 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
10370 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
10380 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65  eSize;.    pPage
10390 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73  r->pTmpSpace = s
103a0 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46  qlite3ReallocOrF
103b0 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
103c0 53 70 61 63 65 2c 20 70 61 67 65 53 69 7a 65 29  Space, pageSize)
103d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
103e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
103f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
10400 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
10410 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
10420 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
10430 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
10440 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
10450 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
10460 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
10470 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
10480 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
10490 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
104a0 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
104b0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
104c0 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
104d0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
104e0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
104f0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
10500 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
10510 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
10520 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
10530 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
10540 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
10550 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
10560 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
10570 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
10580 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f 73  nt;.void clear_s
10590 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
105a0 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  r(){.  sqlite3_i
105b0 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30 3b  o_error_hit = 0;
105c0 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  .}.void disable_
105d0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
105e0 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76  ors(void){.  sav
105f0 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33  ed_cnt = sqlite3
10600 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
10610 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f  g;.  sqlite3_io_
10620 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
10630 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c  -1;.}.void enabl
10640 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10650 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73  rrors(void){.  s
10660 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
10670 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f  pending = saved_
10680 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  cnt;.}.#else.# d
10690 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d 75  efine clear_simu
106a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29  lated_io_error()
106b0 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62 6c  .# define disabl
106c0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
106d0 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e 65  rrors().# define
106e0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
106f0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65  d_io_errors().#e
10700 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ndif../*.** Read
10710 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
10720 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
10730 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
10740 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
10750 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
10760 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f  ts to. .**.** No
10770 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
10780 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61 74  is done. The rat
10790 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20 69  ional for this i
107a0 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e 63  s that this func
107b0 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20  tion .** may be 
107c0 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20 74  called even if t
107d0 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
107e0 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61 69   exist or contai
107f0 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20 0a  n a header. In .
10800 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20 73  ** these cases s
10810 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20 77  qlite3OsRead() w
10820 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ill return an er
10830 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74 68  ror, to which th
10840 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65  e correct .** re
10850 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65 72  sponse is to zer
10860 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74 20  o the memory at 
10870 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e  pDest and contin
10880 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20 65  ue.  A real IO e
10890 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72  rror .** will pr
108a0 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20 61  esumably recur a
108b0 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70 20  nd be picked up 
108c0 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68 69  later (Todo: Thi
108d0 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e 0a  nk about this)..
108e0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
108f0 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65  gerReadFileheade
10900 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
10910 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64   int N, unsigned
10920 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20   char *pDest){. 
10930 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10940 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44  _OK;.  memset(pD
10950 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66  est, 0, N);.  if
10960 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20  ( MEMDB==0 ){.  
10970 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
10980 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
10990 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
109a0 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  ek(pPager->fd, 0
109b0 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69  );.    enable_si
109c0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
109d0 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45  s();.    IOTRACE
109e0 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
109f0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
10a00 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
10a10 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
10a20 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20  fd, pDest, N);. 
10a30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10a40 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
10a50 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  AD ){.      rc =
10a60 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
10a70 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
10a80 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
10a90 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
10aa0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
10ab0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
10ac0 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
10ad0 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
10ae0 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
10af0 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
10b00 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
10b10 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
10b20 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
10b30 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
10b40 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
10b50 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
10b60 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
10b70 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
10b80 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
10b90 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
10ba0 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
10bb0 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
10bc0 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
10bd0 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
10be0 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
10bf0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10c00 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
10c10 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  ger){.  i64 n;. 
10c20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
10c30 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
10c40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
10c50 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
10c60 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
10c70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
10c80 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50  =0 ){.    n = pP
10c90 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
10ca0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66 28  } else {.    if(
10cb0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
10cc0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
10cd0 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
10ce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61  E_OK ){.      pa
10cf0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
10d00 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74  , rc);.      ret
10d10 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
10d20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
10d30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
10d40 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  {.      n = 1;. 
10d50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d60 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
10d70 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  eSize;.    }.   
10d80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
10d90 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
10da0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10db0 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
10dc0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
10dd0 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  =(PENDING_BYTE/p
10de0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
10df0 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d   ){.    n++;.  }
10e00 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
10e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
10e20 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
10e30 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
10e40 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
10e50 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
10e60 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
10e70 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
10e80 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
10e90 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
10ea0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
10eb0 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
10ec0 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
10ed0 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
10ee0 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
10ef0 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
10f00 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  f../*.** Forward
10f10 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
10f20 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
10f30 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a  ournal(Pager*);.
10f40 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
10f50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
10f60 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
10f70 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
10f80 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
10f90 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
10fa0 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
10fb0 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
10fc0 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
10fd0 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
10fe0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  * sqlite3PagerMo
10ff0 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65  vepage() routine
11000 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67   can leave a pag
11010 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65  e in the .** pNe
11020 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65  xtFree/pPrevFree
11030 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f   list that is no
11040 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20  t a part of any 
11050 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73  hash-chain..*/.s
11060 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
11070 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72  kHashChain(Pager
11080 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
11090 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
110a0 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20  ->pgno==0 ){.   
110b0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
110c0 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50  extHash==0 && pP
110d0 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  g->pPrevHash==0 
110e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
110f0 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
11100 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70  extHash ){.    p
11110 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
11120 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e  PrevHash = pPg->
11130 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20  pPrevHash;.  }. 
11140 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48   if( pPg->pPrevH
11150 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ash ){.    asser
11160 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
11170 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50  [pPg->pgno & (pP
11180 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 21  ager->nHash-1)]!
11190 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
111a0 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
111b0 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
111c0 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
111d0 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50 67  .    int h = pPg
111e0 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
111f0 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20 20  ->nHash-1);.    
11200 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
11210 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73   = pPg->pNextHas
11220 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  h;.  }.  if( MEM
11230 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72 48  DB ){.    clearH
11240 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
11250 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
11260 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ));.  }.  pPg->p
11270 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  gno = 0;.  pPg->
11280 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
11290 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
112a0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  }../*.** Unlink 
112b0 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
112c0 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c  free list (the l
112d0 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
112e0 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a   where nRef==0).
112f0 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20  ** and from its 
11300 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63  hash collision c
11310 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
11320 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28  void unlinkPage(
11330 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
11340 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
11350 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
11360 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73  * Keep the pFirs
11370 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20  tSynced pointer 
11380 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20  pointing at the 
11390 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a  first synchroniz
113a0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28  ed page */.  if(
113b0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46   pPg==pPager->pF
113c0 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
113d0 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
113e0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
113f0 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
11400 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
11410 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
11420 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
11430 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
11440 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  }..  /* Unlink f
11450 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
11460 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70   */.  if( pPg->p
11470 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
11480 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
11490 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
114a0 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65  >pNextFree;.  }e
114b0 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
114c0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
114d0 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
114e0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
114f0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
11500 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
11510 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  tFree ){.    pPg
11520 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
11530 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
11540 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  revFree;.  }else
11550 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
11560 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67  ager->pLast==pPg
11570 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
11580 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
11590 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50  evFree;.  }.  pP
115a0 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  g->pNextFree = p
115b0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
115c0 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  0;..  /* Unlink 
115d0 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61  from the pgno ha
115e0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e  sh table */.  un
115f0 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
11600 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23  ager, pPg);.}..#
11610 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11620 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
11630 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11640 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
11650 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
11660 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74  database.  Delet
11670 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77  e.** all pages w
11680 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  hose pgno is lar
11690 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
116a0 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
116b0 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20  nreferenced..** 
116c0 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
116d0 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
116e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
116f0 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  zeroed..*/.stati
11700 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75  c void memoryTru
11710 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
11720 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
11730 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
11740 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
11750 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
11760 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
11770 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
11780 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
11790 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
117a0 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
117b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
117c0 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
117d0 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
117e0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
117f0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
11800 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
11810 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
11820 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
11830 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
11840 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
11850 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
11860 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
11870 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
11880 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
11890 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
118a0 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
118b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
118c0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
118d0 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
118e0 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
118f0 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  p).#endif../*.**
11900 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
11910 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
11920 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
11930 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
11940 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
11950 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
11960 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
11970 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
11980 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
11990 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
119a0 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
119b0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
119c0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
119d0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
119e0 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
119f0 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
11a00 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
11a10 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
11a20 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
11a30 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
11a40 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
11a50 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
11a60 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
11a70 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
11a80 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
11a90 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
11aa0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
11ab0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
11ac0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
11ad0 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
11ae0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
11af0 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
11b00 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
11b10 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
11b20 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
11b30 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
11b40 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
11b50 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20   be unknown */. 
11b60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11b70 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11b80 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
11b90 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44  dbSize<0 || MEMD
11ba0 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  B );..  if( pPag
11bb0 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
11bc0 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
11bd0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
11be0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
11bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11c00 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
11c10 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
11c20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11c30 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69  ITE_BUSY && sqli
11c40 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11c50 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
11c60 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20  syHandler) );.  
11c70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11c80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
11c90 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63  ger->state = loc
11ca0 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
11cb0 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
11cc0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
11cd0 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
11ce0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11cf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
11d00 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
11d10 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11d20 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
11d30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11d40 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
11d50 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
11d60 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
11d70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11d80 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11d90 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b  ARED || MEMDB );
11da0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
11db0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
11dc0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11dd0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
11de0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
11df0 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ode;.    return 
11e00 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  rc;.  }.  if( nP
11e10 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70  age>=(unsigned)p
11e20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
11e30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11e40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
11e50 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
11e60 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
11e70 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Page;.    memory
11e80 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
11e90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
11ea0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
11eb0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
11ec0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
11ed0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11ee0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11ef0 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65  }..  /* Get an e
11f00 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
11f10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
11f20 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e  fore truncating.
11f30 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
11f40 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
11f50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
11f60 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
11f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11f80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
11f90 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
11fa0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
11fb0 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
11fc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11fd0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
11fe0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
11ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12000 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
12010 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
12020 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
12030 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
12040 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
12050 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
12060 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
12070 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
12080 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
12090 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
120a0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
120b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
120c0 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
120d0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
120e0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
120f0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
12100 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
12110 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
12120 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
12130 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
12140 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
12150 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
12160 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
12170 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
12180 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
12190 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
121a0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
121b0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
121c0 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
121d0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
121e0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
121f0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
12200 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
12210 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
12220 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
12230 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
12240 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
12250 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
12260 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
12270 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12280 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
12290 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
122a0 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20  NAGEMENT.  /* A 
122b0 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20  malloc() cannot 
122c0 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54  fail in sqlite3T
122d0 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f  hreadData() as o
122e0 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73  ne or more calls
122f0 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   to .  ** malloc
12300 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72  () must have alr
12310 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62  eady been made b
12320 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65  y this thread be
12330 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a  fore it gets.  *
12340 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e  * to this point.
12350 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20   This means the 
12360 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20  ThreadData must 
12370 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61  have been alloca
12380 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a  ted already.  **
12390 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44   so that ThreadD
123a0 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62  ata.nAlloc can b
123b0 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68  e set..  */.  Th
123c0 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d  readData *pTsd =
123d0 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
123e0 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ta();.  assert( 
123f0 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65  pPager );.  asse
12400 72 74 28 20 70 54 73 64 20 26 26 20 70 54 73 64  rt( pTsd && pTsd
12410 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64  ->nAlloc );.#end
12420 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69  if..  disable_si
12430 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
12440 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  s();.  pPager->e
12450 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50  rrCode = 0;.  pP
12460 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
12470 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  ode = 0;.  pager
12480 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
12490 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
124a0 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
124b0 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c  ;.  enable_simul
124c0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
124d0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
124e0 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
124f0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
12500 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53    IOTRACE(("CLOS
12510 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  E %p\n", pPager)
12520 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ).  assert( pPag
12530 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28  er->errCode || (
12540 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12550 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72  pen==0 && pPager
12560 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29  ->stmtOpen==0) )
12570 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
12580 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
12590 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
125a0 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
125b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
125c0 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
125d0 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61  rnal);.  if( pPa
125e0 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
125f0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
12600 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ose(&pPager->stf
12610 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
12620 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
12630 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70  ->fd);.  /* Temp
12640 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d   files are autom
12650 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
12660 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20   by the OS.  ** 
12670 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  if( pPager->temp
12680 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73  File ){.  **   s
12690 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
126a0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
126b0 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a  );.  ** }.  */..
126c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
126d0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
126e0 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f  GEMENT.  /* Remo
126f0 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72 6f  ve the pager fro
12700 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  m the linked lis
12710 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61 72  t of pagers star
12720 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68  ting at .  ** Th
12730 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72 20  readData.pPager 
12740 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  if memory-manage
12750 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e  ment is enabled.
12760 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
12770 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72  er==pTsd->pPager
12780 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50   ){.    pTsd->pP
12790 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ager = pPager->p
127a0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
127b0 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a     Pager *pTmp;.
127c0 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70      for(pTmp = p
127d0 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d  Tsd->pPager; pTm
127e0 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72  p->pNext!=pPager
127f0 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
12800 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e  xt){}.    pTmp->
12810 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e  pNext = pPager->
12820 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69  pNext;.  }.#endi
12830 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  f.  sqliteFree(p
12840 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
12850 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12860 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
12870 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
12880 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
12890 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
128a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
128b0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
128c0 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74  e given page dat
128d0 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  a..*/.Pgno sqlit
128e0 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
128f0 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20  r(DbPage *p){.  
12900 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
12910 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
12920 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
12930 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
12940 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
12950 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
12960 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
12970 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
12980 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
12990 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
129a0 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
129b0 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
129c0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
129d0 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
129e0 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
129f0 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
12a00 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
12a10 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
12a20 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
12a30 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
12a40 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
12a50 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
12a60 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
12a70 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
12a80 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
12a90 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
12aa0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
12ab0 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
12ac0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
12ad0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
12ae0 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
12af0 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
12b00 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
12b10 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
12b20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
12b30 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
12b40 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
12b50 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
12b60 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
12b70 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
12b80 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
12b90 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
12ba0 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
12bb0 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
12bc0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
12bd0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
12be0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
12bf0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
12c00 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
12c10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
12c30 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
12c40 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
12c50 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
12c60 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
12c70 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
12c80 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
12c90 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
12ca0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
12cb0 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
12cc0 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
12cd0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
12ce0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
12cf0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
12d00 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
12d10 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
12d20 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
12d30 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
12d40 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
12d50 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
12d60 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
12d70 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
12d80 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
12d90 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
12da0 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
12db0 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
12dc0 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
12dd0 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
12de0 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
12df0 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
12e00 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
12e10 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
12e20 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
12e30 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
12e40 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
12e50 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
12e60 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
12e70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
12e80 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
12e90 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  ){.  page_ref(pP
12ea0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  g);.  return SQL
12eb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12ec0 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
12ed0 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  l.  In other wor
12ee0 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  ds, make sure al
12ef0 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74  l the pages that
12f00 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72   have.** been wr
12f10 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
12f20 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c  rnal have actual
12f30 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73  ly reached the s
12f40 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a  urface of the.**
12f50 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f   disk.  It is no
12f60 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79  t safe to modify
12f70 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
12f80 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
12f90 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a  l after.** the j
12fa0 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20  ournal has been 
12fb0 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20  synced.  If the 
12fc0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
12fd0 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65  e is modified be
12fe0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fore.** the jour
12ff0 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e  nal is synced an
13000 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  d a power failur
13010 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e  e occurs, the un
13020 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a  synced journal.*
13030 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20  * data would be 
13040 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c  lost and we woul
13050 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63  d be unable to c
13060 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61  ompletely rollba
13070 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ck the.** databa
13080 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74  se changes.  Dat
13090 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
130a0 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a   would occur..**
130b0 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
130c0 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74  e also updates t
130d0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e  he nRec field in
130e0 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
130f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28  he journal..** (
13100 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20  See comments on 
13110 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61  the pager_playba
13120 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72  ck() routine for
13130 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
13140 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20  rmation.).** If 
13150 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73  the sync mode is
13160 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73   FULL, two syncs
13170 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69   will occur.  Fi
13180 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f  rst the whole jo
13190 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63  urnal.** is sync
131a0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65  ed, then the nRe
131b0 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
131c0 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e  ed, then a secon
131d0 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  d sync occurs..*
131e0 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61  *.** For tempora
131f0 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65  ry databases, we
13200 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20   do not care if 
13210 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  we are able to r
13220 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72  ollback.** after
13230 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
13240 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73  , so sync occurs
13250 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13260 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20  tine clears the 
13270 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f  needSync field o
13280 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72  f every page cur
13290 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20  rent held in.** 
132a0 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  memory..*/.stati
132b0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
132c0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
132d0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
132e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
132f0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63  E_OK;..  /* Sync
13300 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66   the journal bef
13310 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68  ore modifying th
13320 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a  e main database.
13330 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74    ** (assuming t
13340 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61  here is a journa
13350 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74  l and it needs t
13360 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20  o be synced.).  
13370 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
13380 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
13390 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65   if( !pPager->te
133a0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  mpFile ){.      
133b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
133c0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
133d0 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20       /* assert( 
133e0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
133f0 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67  ); // noSync mig
13400 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e  ht be set if syn
13410 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a  chronous.      *
13420 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66  * was turned off
13430 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73   after the trans
13440 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
13450 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35  ed.  Ticket #615
13460 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   */.#ifndef NDEB
13470 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  UG.      {.     
13480 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20     /* Make sure 
13490 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  the pPager->nRec
134a0 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20   counter we are 
134b0 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20  keeping agrees. 
134c0 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74         ** with t
134d0 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  he nRec computed
134e0 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
134f0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
13500 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
13510 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a         i64 jSz;.
13520 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13530 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
13540 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
13550 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13560 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
13570 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
13580 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13590 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  lOff==jSz );.   
135a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
135b0 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57    {.        /* W
135c0 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
135d0 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
135e0 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
135f0 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
13600 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
13610 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
13620 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
13630 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
13640 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
13650 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
13660 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
13670 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
13680 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
13690 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
136a0 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
136b0 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20  rollback. .     
136c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
136d0 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
136e0 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
136f0 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e  PAGERTRACE2("SYN
13700 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
13710 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
13720 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
13730 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20  IOTRACE(("JSYNC 
13740 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
13750 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
13760 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
13770 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
13780 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
13790 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
137a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
137b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
137c0 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
137d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
137e0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
137f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
13800 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
13810 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
13820 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13830 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f 54   rc;.        IOT
13840 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
13850 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
13860 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
13870 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
13880 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66  rnalHdr + sizeof
13890 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c  (aJournalMagic),
138a0 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63 20   4)).        rc 
138b0 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
138c0 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
138d0 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20  r->nRec);.      
138e0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
138f0 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72  n rc;..        r
13900 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
13910 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
13920 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
13930 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
13940 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13950 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41        }.      PA
13960 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
13970 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
13980 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
13990 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
139a0 45 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22 2c  E(("JSYNC %d\n",
139b0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
139c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
139d0 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
139e0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79  pPager->full_fsy
139f0 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
13a00 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
13a10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13a20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
13a30 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   1;.    }.    pP
13a40 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
13a50 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73   0;..    /* Eras
13a60 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  e the needSync f
13a70 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70  lag from every p
13a80 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
13a90 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
13aa0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
13ab0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
13ac0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
13ad0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  nc = 0;.    }.  
13ae0 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
13af0 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
13b00 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69  >pFirst;.  }..#i
13b10 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f  fndef NDEBUG.  /
13b20 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e  * If the Pager.n
13b30 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
13b40 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50  clear then the P
13b50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20  gHdr.needSync.  
13b60 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73  ** flag must als
13b70 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61  o be clear for a
13b80 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66  ll pages.  Verif
13b90 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a  y that this.  **
13ba0 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72   invariant is tr
13bb0 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b  ue..  */.  else{
13bc0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
13bd0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
13be0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
13bf0 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  l){.      assert
13c00 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
13c10 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  =0 );.    }.    
13c20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
13c30 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50  pFirstSynced==pP
13c40 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a  ager->pFirst );.
13c50 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
13c60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13c70 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74  * Merge two list
13c80 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65  s of pages conne
13c90 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61  cted by pDirty a
13ca0 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72  nd in pgno order
13cb0 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68  ..** Do not both
13cc0 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65   fixing the pPre
13cd0 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  vDirty pointers.
13ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
13cf0 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74   *merge_pagelist
13d00 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64  (PgHdr *pA, PgHd
13d10 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20  r *pB){.  PgHdr 
13d20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a  result, *pTail;.
13d30 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c    pTail = &resul
13d40 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26  t;.  while( pA &
13d50 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20  & pB ){.    if( 
13d60 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e  pA->pgno<pB->pgn
13d70 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c  o ){.      pTail
13d80 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
13d90 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b       pTail = pA;
13da0 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e  .      pA = pA->
13db0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
13dc0 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  e{.      pTail->
13dd0 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20  pDirty = pB;.   
13de0 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20     pTail = pB;. 
13df0 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44       pB = pB->pD
13e00 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
13e10 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20    if( pA ){.    
13e20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20  pTail->pDirty = 
13e30 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  pA;.  }else if( 
13e40 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pB ){.    pTail-
13e50 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
13e60 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c  }else{.    pTail
13e70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
13e80 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c  }.  return resul
13e90 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  t.pDirty;.}../*.
13ea0 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74  ** Sort the list
13eb0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63   of pages in acc
13ec0 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
13ed0 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65  pgno.  Pages are
13ee0 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79  .** connected by
13ef0 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73   pDirty pointers
13f00 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74  .  The pPrevDirt
13f10 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a  y pointers are.*
13f20 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74  * corrupted by t
13f30 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65  his sort..*/.#de
13f40 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
13f50 45 54 20 32 35 0a 73 74 61 74 69 63 20 50 67 48  ET 25.static PgH
13f60 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69 73  dr *sort_pagelis
13f70 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a 20  t(PgHdr *pIn){. 
13f80 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52 54   PgHdr *a[N_SORT
13f90 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0a 20 20  _BUCKET], *p;.  
13fa0 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28  int i;.  memset(
13fb0 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29 29  a, 0, sizeof(a))
13fc0 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20 29  ;.  while( pIn )
13fd0 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20  {.    p = pIn;. 
13fe0 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72     pIn = p->pDir
13ff0 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72 74  ty;.    p->pDirt
14000 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  y = 0;.    for(i
14010 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43  =0; i<N_SORT_BUC
14020 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  KET-1; i++){.   
14030 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29     if( a[i]==0 )
14040 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  {.        a[i] =
14050 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   p;.        brea
14060 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  k;.      }else{.
14070 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72 67          p = merg
14080 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c  e_pagelist(a[i],
14090 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b 69   p);.        a[i
140a0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
140b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
140c0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20  N_SORT_BUCKET-1 
140d0 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  ){.      a[i] = 
140e0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61  merge_pagelist(a
140f0 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  [i], p);.    }. 
14100 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20   }.  p = a[0];. 
14110 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f   for(i=1; i<N_SO
14120 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b  RT_BUCKET; i++){
14130 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70  .    p = merge_p
14140 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29  agelist(p, a[i])
14150 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
14160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
14170 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
14180 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
14190 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
141a0 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
141b0 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
141c0 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
141d0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
141e0 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
141f0 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
14200 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
14210 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
14220 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
14230 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
14240 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
14250 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
14260 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
14270 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
14280 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
14290 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
142a0 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
142b0 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
142c0 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
142d0 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
142e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
142f0 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
14300 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
14310 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
14320 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
14330 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
14340 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
14350 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
14360 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
14370 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
14380 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
14390 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
143a0 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
143b0 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
143c0 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
143d0 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
143e0 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
143f0 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
14400 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14410 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
14420 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
14430 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
14440 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
14450 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
14460 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
14470 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
14480 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
14490 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
144a0 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
144b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
144c0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
144d0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
144e0 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
144f0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
14500 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
14510 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
14520 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
14530 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
14540 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
14550 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
14560 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
14570 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
14580 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
14590 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
145a0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
145b0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
145c0 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
145d0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
145e0 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
145f0 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
14600 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
14610 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
14620 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
14630 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
14640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14650 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
14660 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70    pList = sort_p
14670 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a  agelist(pList);.
14680 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
14690 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
146a0 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  ist->dirty );.  
146b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
146c0 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
146d0 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
146e0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
146f0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
14700 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
14710 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
14720 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
14730 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
14740 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
14750 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
14760 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
14770 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
14780 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
14790 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
147a0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
147b0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
147c0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
147d0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
147e0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
147f0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
14800 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
14810 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
14820 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
14830 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
14840 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
14850 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
14860 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
14870 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
14880 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
14890 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
148a0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
148b0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
148c0 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
148d0 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  no);.      IOTRA
148e0 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25 64  CE(("PGOUT %p %d
148f0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c 69  \n", pPager, pLi
14900 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  st->pgno)).     
14910 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
14920 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
14930 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
14940 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14950 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
14960 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20  r->nWrite);.    
14970 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
14980 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
14990 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e 4f   PAGERTRACE3("NO
149a0 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
149b0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
149c0 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
149d0 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  o);.    }.#endif
149e0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
149f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69  turn rc;.    pLi
14a00 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  st->dirty = 0;.#
14a10 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
14a20 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69  CK_PAGES.    pLi
14a30 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  st->pageHash = p
14a40 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c  ager_pagehash(pL
14a50 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ist);.#endif.   
14a60 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
14a70 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
14a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14a90 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
14aa0 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
14ab0 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
14ac0 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
14ad0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
14ae0 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
14af0 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
14b00 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
14b10 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
14b20 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
14b30 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
14b40 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
14b50 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
14b60 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
14b70 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69  turn pPager->pDi
14b80 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rty;.}../*.** Re
14b90 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
14ba0 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72  re is a hot jour
14bb0 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  nal on the given
14bc0 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74   pager..** A hot
14bd0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
14be0 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
14bf0 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a   played back..**
14c00 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65  .** If the curre
14c10 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64  nt size of the d
14c20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
14c30 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20  0 but a journal 
14c40 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20  file.** exists, 
14c50 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79  that is probably
14c60 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
14c70 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61  left over from a
14c80 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61   prior.** databa
14c90 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  se with the same
14ca0 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c   name.  Just del
14cb0 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
14cc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
14cd0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67  asHotJournal(Pag
14ce0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
14cf0 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  f( !pPager->useJ
14d00 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20  ournal ) return 
14d10 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
14d20 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50  3OsFileExists(pP
14d30 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20  ager->zJournal) 
14d40 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
14d50 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
14d60 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
14d70 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72  ger->fd) ) retur
14d80 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
14d90 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
14da0 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  (pPager)==0 ){. 
14db0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
14dc0 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
14dd0 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nal);.    return
14de0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
14df0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
14e00 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66  ../*.** Try to f
14e10 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
14e20 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61 6e  e cache that can
14e30 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a   be recycled. .*
14e40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
14e50 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  e may return SQL
14e60 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
14e70 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45  E_FULL or SQLITE
14e80 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73  _OK. It .** does
14e90 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50 61   not set the pPa
14ea0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72  ger->errCode var
14eb0 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  iable..*/.static
14ec0 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63   int pager_recyc
14ed0 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
14ee0 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50 67  , int syncOk, Pg
14ef0 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50  Hdr **ppPg){.  P
14f00 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70  gHdr *pPg;.  *pp
14f10 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69  Pg = 0;..  /* Fi
14f20 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65 63  nd a page to rec
14f30 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f  ycle.  Try to lo
14f40 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61 74  cate a page that
14f50 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72   does not.  ** r
14f60 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20  equire us to do 
14f70 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68  an fsync() on th
14f80 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  e journal..  */.
14f90 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
14fa0 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20  pFirstSynced;.. 
14fb0 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20   /* If we could 
14fc0 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65 20  not find a page 
14fd0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  that does not re
14fe0 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29  quire an fsync()
14ff0 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75  .  ** on the jou
15000 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66  rnal file then f
15010 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
15020 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
15030 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77  a.  ** very slow
15040 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77   operation, so w
15050 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61  e work hard to a
15060 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f  void it.  But so
15070 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74 20  metimes.  ** it 
15080 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e  can't be helped.
15090 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  .  */.  if( pPg=
150a0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
150b0 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20 26  irst && syncOk &
150c0 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20 69  & !MEMDB){.    i
150d0 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
150e0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
150f0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
15100 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15110 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
15120 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
15130 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
15140 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
15150 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
15160 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
15170 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
15180 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
15190 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
151a0 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
151b0 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
151c0 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
151d0 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
151e0 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
151f0 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
15200 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
15210 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
15220 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
15230 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
15240 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
15250 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
15260 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
15270 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
15280 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
15290 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
152a0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
152b0 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
152c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
152d0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
152e0 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
152f0 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
15300 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
15310 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
15320 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
15340 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
15350 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  irst;.  }.  if( 
15360 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  pPg==0 ){.    re
15370 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
15380 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
15390 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
153a0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
153b0 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
153c0 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
153d0 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20  s dirty..  */.  
153e0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
153f0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
15400 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
15410 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
15420 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
15430 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
15440 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 1;.    pPg->p
15450 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72  Dirty = 0;.    r
15460 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
15470 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b  pagelist( pPg );
15480 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
154a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
154b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
154c0 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a  Pg->dirty==0 );.
154d0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
154e0 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
154f0 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
15500 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
15510 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68  then.  ** set th
15520 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52  e global alwaysR
15530 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68  ollback flag, th
15540 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65  us disabling the
15550 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
15560 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
15570 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f   optimization fo
15580 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  r the rest of th
15590 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
155a0 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73    ** It is neces
155b0 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20  sary to do this 
155c0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
155d0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
155e0 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68  llback.  ** migh
155f0 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74  t be reloaded at
15600 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75   a later time bu
15610 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  t at that point 
15620 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65  we won't remembe
15630 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77  r.  ** that is w
15640 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
15650 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
15660 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
15670 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62  ages must.  ** b
15680 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  e marked as alwa
15690 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20  ysRollback from 
156a0 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a  here on out..  *
156b0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  /.  if( pPg->alw
156c0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
156d0 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57     IOTRACE(("ALW
156e0 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c  AYS_ROLLBACK %p\
156f0 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
15700 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
15710 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d  ollback = 1;.  }
15720 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68  ..  /* Unlink th
15730 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
15740 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
15750 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
15760 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61  .  */.  unlinkPa
15770 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54 5f  ge(pPg);.  TEST_
15780 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76  INCR(pPager->nOv
15790 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20  fl);..  *ppPg = 
157a0 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
157b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
157c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
157d0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72 65  is called to fre
157e0 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64 79  e superfluous dy
157f0 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61  namically alloca
15800 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65  ted memory.** he
15810 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ld by the pager 
15820 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69  system. Memory i
15830 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51 4c  n use by any SQL
15840 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63 61  ite pager alloca
15850 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 75  ted.** by the cu
15860 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61 79  rrent thread may
15870 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28 29   be sqliteFree()
15880 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69  ed..**.** nReq i
15890 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
158a0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
158b0 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20 74  required. Once t
158c0 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20  his much has.** 
158d0 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20 74  been released, t
158e0 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
158f0 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65 20  rns. A negative 
15900 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20 6d  value for nReq m
15910 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73 20  eans.** free as 
15920 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
15930 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65 74  ossible. The ret
15940 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65  urn value is the
15950 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a   total number .*
15960 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  * of bytes of me
15970 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  mory released..*
15980 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
15990 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
159a0 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c  NAGEMENT.int sql
159b0 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65  ite3PagerRelease
159c0 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29  Memory(int nReq)
159d0 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64  {.  const Thread
159e0 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73  Data *pTsdro = s
159f0 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
15a00 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50 61  ReadOnly();.  Pa
15a10 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 52  ger *p;.  int nR
15a20 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20 69  eleased = 0;.  i
15a30 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt i;..  /* If t
15a40 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75  he the global mu
15a50 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68 69  tex is held, thi
15a60 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65 63  s subroutine bec
15a70 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70  omes a.  ** o-op
15a80 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66 20  ; zero bytes of 
15a90 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65 64  memory are freed
15aa0 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61 75  .  This is becau
15ab0 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20  se.  ** some of 
15ac0 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64  the code invoked
15ad0 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
15ae0 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20  n may also.  ** 
15af0 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  try to obtain th
15b00 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74 69  e mutex, resulti
15b10 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b  ng in a deadlock
15b20 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  ..  */.  if( sql
15b30 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30 29  ite3OsInMutex(0)
15b40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
15b50 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65  ;.  }..  /* Oute
15b60 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20  rmost loop runs 
15b70 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20  for at most two 
15b80 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73  iterations. Firs
15b90 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20  t iteration we. 
15ba0 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20   ** try to find 
15bb0 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20  memory that can 
15bc0 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68  be released with
15bd0 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e  out calling fsyn
15be0 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a  c(). Second.  **
15bf0 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63   iteration (whic
15c00 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74  h only runs if t
15c10 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64 20  he first failed 
15c20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79 74  to free nReq byt
15c30 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72  es of.  ** memor
15c40 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 20  y) is permitted 
15c50 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e  to call fsync().
15c60 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72   This is of cour
15c70 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20  se much more .  
15c80 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20  ** expensive..  
15c90 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
15ca0 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f  =1; i++){..    /
15cb0 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61  * Loop through a
15cc0 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70 61  ll the SQLite pa
15cd0 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20 74  gers opened by t
15ce0 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61  he current threa
15cf0 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d  d. */.    for(p=
15d00 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 20  pTsdro->pPager; 
15d10 70 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20  p && (nReq<0 || 
15d20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b  nReleased<nReq);
15d30 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
15d40 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
15d50 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
15d60 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68       /* For each
15d70 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66   pager, try to f
15d80 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65  ree as many page
15d90 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77  s as possible (w
15da0 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a  ithout .      **
15db0 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29   calling fsync()
15dc0 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
15dd0 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  first iteration 
15de0 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  of the outermost
15df0 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29   .      ** loop)
15e00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
15e10 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f   while( SQLITE_O
15e20 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72  K==(rc = pager_r
15e30 65 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70 50  ecycle(p, i, &pP
15e40 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20 20  g)) && pPg) {.  
15e50 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66        /* We've f
15e60 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66  ound a page to f
15e70 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ree. At this poi
15e80 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nt the page has 
15e90 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a  been .        **
15ea0 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
15eb0 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c  e page hash-tabl
15ec0 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  e, free-list and
15ed0 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20   synced-list .  
15ee0 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74        ** (pFirst
15ef0 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73  Synced). It is s
15f00 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20  till in the all 
15f10 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73  pages (pAll) lis
15f20 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 52  t. .        ** R
15f30 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
15f40 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20 66  is list before f
15f50 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20 20  reeing..        
15f60 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 6f  **.        ** To
15f70 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50 61  do: Check the Pa
15f80 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20 74  ger.pStmt list t
15f90 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69 73  o make sure this
15fa0 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20   is Ok. It .    
15fb0 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20      ** probably 
15fc0 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20  is though..     
15fd0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67     */.        Pg
15fe0 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  Hdr *pTmp;.     
15ff0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29     assert( pPg )
16000 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 72  ;.        page_r
16010 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
16020 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
16030 20 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e 70     if( pPg==p->p
16040 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  All ){.         
16050 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d    p->pAll = pPg-
16060 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
16070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16080 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70 2d      for( pTmp=p-
16090 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65  >pAll; pTmp->pNe
160a0 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70  xtAll!=pPg; pTmp
160b0 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20  =pTmp->pNextAll 
160c0 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54  ){}.          pT
160d0 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70  mp->pNextAll = p
160e0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
160f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16100 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c  nReleased += sql
16110 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67  iteAllocSize(pPg
16120 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
16130 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  eFree(pPg);.    
16140 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 72    }..      if( r
16150 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16160 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72          /* An er
16170 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
16180 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
16190 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
161a0 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a  or .        ** j
161b0 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f  ournal in pager_
161c0 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65  recycle(). The e
161d0 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75  rror is not retu
161e0 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20  rned to the .   
161f0 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f       ** caller o
16200 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  f this function.
16210 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68   Instead, set th
16220 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20  e Pager.errCode 
16230 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20  variable..      
16240 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77    ** The error w
16250 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20  ill be returned 
16260 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20  to the user (or 
16270 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61  users, in the ca
16280 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  se .        ** o
16290 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72  f a shared pager
162a0 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70   cache) of the p
162b0 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74  ager for which t
162c0 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  he error occured
162d0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
162e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63       assert( (rc
162f0 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49  &0xff)==SQLITE_I
16300 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OERR || rc==SQLI
16310 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20  TE_FULL );.     
16320 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74     assert( p->st
16330 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
16340 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70  VED );.        p
16350 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72 63  ager_error(p, rc
16360 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
16370 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e  .  }..  return n
16380 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64  Released;.}.#end
16390 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
163a0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
163b0 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  EMENT */../*.** 
163c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
163d0 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
163e0 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  n the shared loc
163f0 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  k required befor
16400 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
16410 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
16420 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
16430 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68  he shared lock h
16440 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
16450 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69  en obtained, thi
16460 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
16470 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
16480 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
16490 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
164a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
164b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66  SQLITE_OK;..  if
164c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
164d0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
164e0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
164f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
16500 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
16510 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
16520 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
16530 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  k ){.        rc 
16540 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
16550 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
16560 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
16570 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
16580 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
16590 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
165a0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
165b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
165c0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
165d0 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45  er->state>=SHARE
165e0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  D_LOCK );.      
165f0 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  }.  .      /* If
16600 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
16610 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
16620 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
16630 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
16640 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
16650 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74  ile, then it eit
16660 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20  her needs to be 
16670 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64  played back or d
16680 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f  eleted..      */
16690 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 48 6f  .      if( hasHo
166a0 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  tJournal(pPager)
166b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47   ){.        /* G
166c0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
166d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
166e0 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
166f0 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
16700 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
16710 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
16720 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
16730 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
16740 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
16750 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
16760 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65  lock. If it were
16770 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  , another proces
16780 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65  s might open the
16790 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
167a0 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63  base file, detec
167b0 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  t the RESERVED l
167c0 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64  ock, and conclud
167d0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20  e that the.     
167e0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
167f0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
16800 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
16810 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
16820 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a  ng it .        *
16830 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  * back..        
16840 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42  ** .        ** B
16850 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72  ecause the inter
16860 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44  mediate RESERVED
16870 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71   lock is not req
16880 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20  uested, the.    
16890 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72      ** second pr
168a0 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74  ocess will get t
168b0 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  o this point in 
168c0 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
168d0 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  l to.        ** 
168e0 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20  obtain it's own 
168f0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
16900 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
16910 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
16920 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16930 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
16940 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
16950 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
16960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16970 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
16980 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
16990 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
169a0 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
169b0 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
169c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
169d0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
169e0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
169f0 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  ;. .        /* O
16a00 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
16a10 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
16a20 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
16a30 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
16a40 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
16a50 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
16a60 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
16a70 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
16a80 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
16a90 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
16aa0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
16ab0 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
16ac0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
16ad0 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
16ae0 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
16af0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
16b00 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  holds.        **
16b10 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
16b20 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
16b30 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
16b40 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
16b50 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
16b60 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
16b70 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
16b80 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  time..        **
16b90 0a 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f  ..** Open the jo
16ba0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77  urnal for read/w
16bb0 72 69 74 65 20 61 63 63 65 73 73 2e 20 54 68 69  rite access. Thi
16bc0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
16bd0 0a 09 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61  ..** exclusive-a
16be0 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
16bf0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
16c00 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
16c10 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20   and.        ** 
16c20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f  possibly used fo
16c30 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  r a transaction 
16c40 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d  later on. On som
16c50 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20  e systems, the. 
16c60 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e         ** OsTrun
16c70 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64  cate() call used
16c80 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
16c90 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72  cess mode also r
16ca0 65 71 75 69 72 65 73 0a 20 20 20 20 20 20 20 20  equires.        
16cb0 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74 65 20  ** a read/write 
16cc0 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20  file handle..   
16cd0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
16ce0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
16cf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
16d00 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
16d10 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  s(pPager->zJourn
16d20 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  al) ){.         
16d30 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20 20 20   int ro;.       
16d40 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
16d50 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
16d60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
16d70 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
16d80 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  Write(pPager->zJ
16d90 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
16da0 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20 20 20  >jfd, &ro);.    
16db0 20 20 20 20 20 20 69 66 28 20 72 6f 20 29 7b 0a        if( ro ){.
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
16dd0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
16de0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16df0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
16e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16e10 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
16e20 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
16e30 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16e40 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
16e50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16e60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
16e70 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
16e80 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
16e90 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
16ea0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
16eb0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
16ec0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
16ed0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
16ee0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
16ef0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
16f00 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
16f10 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
16f20 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
16f30 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
16f40 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
16f50 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
16f60 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
16f70 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
16f80 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
16f90 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
16fa0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
16fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16fc0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
16fd0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
16fe0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
16ff0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
17000 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
17010 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
17020 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
17030 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
17040 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
17050 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
17060 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
17070 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
17080 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
17090 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64   ){.        PgHd
170a0 72 20 2a 70 50 61 67 65 31 20 3d 20 70 61 67 65  r *pPage1 = page
170b0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
170c0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
170d0 20 70 50 61 67 65 31 20 29 7b 0a 20 20 20 20 20   pPage1 ){.     
170e0 20 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43       unlinkHashC
170f0 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 61  hain(pPager, pPa
17100 67 65 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ge1);.        }.
17110 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
17120 20 21 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70   !pager_lookup(p
17130 50 61 67 65 72 2c 20 31 29 20 29 3b 0a 20 20 20  Pager, 1) );.   
17140 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17150 33 50 61 67 65 72 41 63 71 75 69 72 65 28 70 50  3PagerAcquire(pP
17160 61 67 65 72 2c 20 31 2c 20 26 70 50 61 67 65 31  ager, 1, &pPage1
17170 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
17180 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17190 29 7b 0a 09 20 20 2f 2a 20 54 68 65 20 63 68 61  ){..  /* The cha
171a0 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 73  nge-counter is s
171b0 74 6f 72 65 64 20 61 74 20 6f 66 66 73 65 74 20  tored at offset 
171c0 32 34 2e 20 53 65 65 20 61 6c 73 6f 0a 20 20 20  24. See also.   
171d0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f         ** pager_
171e0 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
171f0 65 72 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20  er()..          
17200 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  */.          u32
17210 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20   iChangeCount = 
17220 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70  retrieve32bits(p
17230 50 61 67 65 31 2c 20 32 34 29 3b 0a 20 20 20 20  Page1, 24);.    
17240 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
17250 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ef++;.          
17260 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
17270 66 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20  f(pPage1);.     
17280 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
17290 66 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 69  f--;.          i
172a0 66 28 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 21  f( iChangeCount!
172b0 3d 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65  =pPager->iChange
172c0 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
172d0 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
172e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
172f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
17300 70 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43  pPager->iChangeC
17310 6f 75 6e 74 20 3d 20 69 43 68 61 6e 67 65 43 6f  ount = iChangeCo
17320 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  unt;.        }. 
17330 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
17340 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17350 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
17360 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  | pPager->state<
17370 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
17380 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
17390 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
173a0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
173b0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
173c0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
173d0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
173e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
173f0 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  uire a page..**.
17400 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ** A read lock o
17410 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
17420 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e  is obtained when
17430 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
17440 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a  is acquired. .**
17450 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20   This read lock 
17460 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20  is dropped when 
17470 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73  the last page is
17480 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a   released..**.**
17490 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f   A _get works fo
174a0 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65  r any page numbe
174b0 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30  r greater than 0
174c0 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61  .  If the databa
174d0 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d  se.** file is sm
174e0 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72  aller than the r
174f0 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74  equested page, t
17500 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69  hen no actual di
17510 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72  sk.** read occur
17520 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79  s and the memory
17530 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61   image of the pa
17540 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  ge is initialize
17550 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f  d to.** all zero
17560 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61  s.  The extra da
17570 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61  ta appended to a
17580 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20   page is always 
17590 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74  initialized.** t
175a0 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73  o zeros the firs
175b0 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73  t time a page is
175c0 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d   loaded into mem
175d0 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  ory..**.** The a
175e0 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74  cquisition might
175f0 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61   fail for severa
17600 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61  l reasons.  In a
17610 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20  ll cases,.** an 
17620 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
17630 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
17640 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69  ed and *ppPage i
17650 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a  s set to NULL..*
17660 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
17670 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
17680 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
17690 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
176a0 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
176b0 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
176c0 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
176d0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
176e0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
176f0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
17700 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
17710 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
17720 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
17730 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
17740 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
17750 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
17760 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
17770 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
17780 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
17790 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
177a0 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
177b0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
177c0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
177d0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
177e0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
177f0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
17800 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
17810 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
17820 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
17830 2a 2a 0a 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67  **.** If clrFlag
17840 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70   is false, the p
17850 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
17860 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66   actually read f
17870 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20  rom disk..** If 
17880 63 6c 66 46 6c 61 67 20 69 73 20 74 72 75 65 2c  clfFlag is true,
17890 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 70 61   it means the pa
178a0 67 65 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  ge is about to b
178b0 65 20 65 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20  e erased and.** 
178c0 72 65 77 72 69 74 74 65 6e 20 77 69 74 68 6f 75  rewritten withou
178d0 74 20 66 69 72 73 74 20 62 65 69 6e 67 20 72 65  t first being re
178e0 61 64 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  ad so there is n
178f0 6f 20 70 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67  o point it doing
17900 0a 2a 2a 20 74 68 65 20 64 69 73 6b 20 49 2f 4f  .** the disk I/O
17910 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17920 50 61 67 65 72 41 63 71 75 69 72 65 28 50 61 67  PagerAcquire(Pag
17930 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
17940 20 70 67 6e 6f 2c 20 44 62 50 61 67 65 20 2a 2a   pgno, DbPage **
17950 70 70 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46  ppPage, int clrF
17960 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  lag){.  PgHdr *p
17970 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
17980 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17990 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
179a0 4c 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  LOCK || pPager->
179b0 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
179c0 31 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  1 );..  /* The m
179d0 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
179e0 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
179f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
17a00 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
17a10 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
17a20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
17a30 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
17a40 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
17a50 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
17a60 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70   || pgno==0 || p
17a70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno==PAGER_MJ_PG
17a80 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
17a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17aa0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
17ab0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
17ac0 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69  e we have not hi
17ad0 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65  t any critical e
17ae0 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61  rrors..  */ .  a
17af0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
17b00 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20   );.  *ppPage = 
17b10 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
17b20 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
17b30 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
17b40 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
17b50 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
17b60 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f  rrCode;.  }..  /
17b70 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
17b80 20 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65   first page acce
17b90 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61  ssed, then get a
17ba0 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a   SHARED lock.  *
17bb0 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  * on the databas
17bc0 65 20 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61  e file. pagerSha
17bd0 72 65 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e  redLock() is a n
17be0 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20  o-op if .  ** a 
17bf0 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73  database lock is
17c00 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20   already held.. 
17c10 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
17c20 53 68 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65  SharedLock(pPage
17c30 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
17c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17c50 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
17c60 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
17c70 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
17c80 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20  OCK );..  pPg = 
17c90 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
17ca0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
17cb0 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
17cc0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
17cd0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
17ce0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
17cf0 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b  */.    int nMax;
17d00 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
17d10 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
17d20 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66  ->nMiss);.    if
17d30 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
17d40 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
17d50 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
17d60 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a  ==0 || MEMDB ||.
17d70 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
17d80 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
17d90 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f   && pPager->doNo
17da0 74 53 79 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20  tSync).    ){.  
17db0 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
17dc0 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
17dd0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
17de0 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61  age>=pPager->nHa
17df0 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  sh ){.        pa
17e00 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
17e10 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
17e20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
17e30 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36  >nHash<256 ? 256
17e40 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68   : pPager->nHash
17e50 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  *2);.        if(
17e60 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d   pPager->nHash==
17e70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
17e80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
17e90 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
17ea0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20      }.      pPg 
17eb0 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
17ec0 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  w( sizeof(*pPg) 
17ed0 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
17ee0 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
17ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f00 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
17f10 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
17f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
17f40 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
17f50 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20  istory) );.     
17f60 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
17f70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17f80 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17f90 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
17fa0 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
17fb0 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66  *pPg));.      if
17fc0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
17fd0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
17fe0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
17ff0 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ger), 0, sizeof(
18000 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20  PgHistory));.   
18010 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
18020 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
18030 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
18040 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
18050 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65  All;.      pPage
18060 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
18070 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
18080 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
18090 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50  pPager->nPage>pP
180a0 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29  ager->nMaxPage )
180b0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
180c0 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  ( pPager->nMaxPa
180d0 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61  ge==(pPager->nPa
180e0 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  ge-1) );.       
180f0 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
18100 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e++;.      }.   
18110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
18120 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
18130 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
18140 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
18150 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18160 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
18170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
18180 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18190 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
181a0 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
181b0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
181c0 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
181d0 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
181e0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
181f0 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
18200 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
18210 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
18220 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
18230 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
18240 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
18250 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
18260 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
18270 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
18280 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
18290 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
182a0 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
182b0 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
182c0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
182d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
182e0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
182f0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
18300 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
18310 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
18320 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
18330 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
18340 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
18350 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
18360 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
18370 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
18380 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
18390 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
183a0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
183b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
183c0 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
183d0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
183e0 20 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61    }.    makeClea
183f0 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
18400 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
18410 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
18420 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
18430 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
18440 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
18450 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
18460 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
18470 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
18480 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
18490 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c  }.    nMax = sql
184a0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
184b0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
184c0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
184d0 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
184e0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
184f0 50 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg);.      rc = 
18500 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
18510 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
18520 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
18530 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67  Populate the pag
18540 65 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74  e with data, eit
18550 68 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66  her by reading f
18560 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
18570 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72  .    ** file, or
18580 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
18590 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a  entire page to z
185a0 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
185b0 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67  if( nMax<(int)pg
185c0 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28  no || MEMDB || (
185d0 63 6c 72 46 6c 61 67 20 26 26 20 21 70 50 61 67  clrFlag && !pPag
185e0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
185f0 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ck) ){.      mem
18600 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
18610 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
18620 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
18630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
18640 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
18650 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
18660 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
18670 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
18680 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
18690 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69  geSize);.      i
186a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
186b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
186c0 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
186d0 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
186e0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20  _TO_DATA(pPg),. 
186f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18700 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
18710 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 49 4f        }.      IO
18730 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
18740 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
18750 67 6e 6f 29 29 0a 20 20 20 20 20 20 50 41 47 45  gno)).      PAGE
18760 52 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25  RTRACE3("FETCH %
18770 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
18780 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
18790 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
187a0 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20   CODEC1(pPager, 
187b0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
187c0 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  g), pPg->pgno, 3
187d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
187e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
187f0 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  !=SQLITE_IOERR_S
18800 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
18810 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d       pPg->pgno =
18820 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
18830 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
18840 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  g);.        retu
18850 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c  rn rc;.      }el
18860 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53 54  se{.        TEST
18870 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52  _INCR(pPager->nR
18880 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ead);.      }.  
18890 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b    }..    /* Link
188a0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
188b0 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62  he page hash tab
188c0 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67  le */.    h = pg
188d0 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
188e0 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65  ash-1);.    asse
188f0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
18900 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
18910 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
18920 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
18930 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
18940 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
18950 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
18960 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
18970 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
18980 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
18990 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
189a0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
189b0 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
189c0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
189d0 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
189e0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
189f0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
18a00 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
18a10 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
18a20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
18a30 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
18a40 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
18a50 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d  >nRef>0 || pgno=
18a60 3d 31 29 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e  =1);.    TEST_IN
18a70 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
18a80 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28 70  ;.    page_ref(p
18a90 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61  Pg);.  }.  *ppPa
18aa0 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  ge = pPg;.  retu
18ab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18ac0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
18ad0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
18ae0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
18af0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
18b00 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
18b10 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
18b20 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
18b30 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
18b40 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
18b50 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
18b60 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
18b70 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67   also sqlite3Pag
18b80 65 72 47 65 74 28 29 2e 20 20 54 68 65 20 64 69  erGet().  The di
18b90 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e  fference between
18ba0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
18bb0 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
18bc0 72 47 65 74 28 29 20 69 73 20 74 68 61 74 20 5f  rGet() is that _
18bd0 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f  get() will go to
18be0 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65   the disk and re
18bf0 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67  ad.** in the pag
18c00 65 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  e if the page is
18c10 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
18c20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75  cache.  This rou
18c30 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tine.** returns 
18c40 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65  NULL if the page
18c50 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
18c60 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f   or if a disk I/
18c70 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20  O error .** has 
18c80 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a  ever happened..*
18c90 2f 0a 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65  /.DbPage *sqlite
18ca0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67  3PagerLookup(Pag
18cb0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
18cc0 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20   pgno){.  PgHdr 
18cd0 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28  *pPg;..  assert(
18ce0 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
18cf0 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20  assert( pgno!=0 
18d00 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
18d10 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55  ->state==PAGER_U
18d20 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  NLOCK ){.    ass
18d30 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41  ert( !pPager->pA
18d40 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78  ll || pPager->ex
18d50 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20  clusiveMode );. 
18d60 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
18d70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
18d80 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
18d90 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
18da0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
18db0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50  turn 0;.  }.  pP
18dc0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
18dd0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
18de0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72    if( pPg==0 ) r
18df0 65 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f  eturn 0;.  page_
18e00 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
18e10 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
18e20 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
18e30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
18e40 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
18e50 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
18e60 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
18e70 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
18e80 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
18e90 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
18ea0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
18eb0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
18ec0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
18ed0 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
18ee0 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
18ef0 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
18f00 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
18f10 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
18f20 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
18f30 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20  .  /* Decrement 
18f40 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
18f50 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70 61 67  unt for this pag
18f60 65 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
18f70 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
18f80 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
18f90 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
18fa0 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
18fb0 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
18fc0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
18fd0 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
18fe0 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
18ff0 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
19000 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
19010 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
19020 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
19030 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
19040 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
19050 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  r;.    pPager = 
19060 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
19070 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
19080 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  = 0;.    pPg->pP
19090 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72  revFree = pPager
190a0 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61  ->pLast;.    pPa
190b0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
190c0 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
190d0 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
190e0 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
190f0 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
19100 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
19110 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
19120 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  st = pPg;.    }.
19130 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
19140 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67  dSync==0 && pPag
19150 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
19160 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
19170 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
19180 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  d = pPg;.    }. 
19190 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
191a0 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
191b0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
191c0 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61  tructor(pPg, pPa
191d0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
191e0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
191f0 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
19200 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
19210 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
19220 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
19230 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
19240 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
19250 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
19260 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19270 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
19280 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
19290 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67  Ref==0 && (!pPag
192a0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
192b0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
192c0 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
192d0 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
192e0 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
192f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
19300 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19310 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
19320 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
19330 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
19340 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
19350 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
19360 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
19370 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
19380 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
19390 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
193a0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
193b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
193c0 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
193d0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
193e0 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
193f0 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
19400 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
19410 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
19420 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
19430 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
19440 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
19450 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
19460 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
19470 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
19480 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
19490 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
194a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
194b0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
194c0 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
194d0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
194e0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
194f0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
19500 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
19510 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
19520 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
19530 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
19540 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
19550 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
19560 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19570 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
19580 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
19590 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
195a0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
195b0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
195c0 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
195d0 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
195e0 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
195f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
19600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19610 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46     pPager->tempF
19620 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile);.  pPager->
19630 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
19640 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
19650 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
19660 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
19670 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
19680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
19690 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
196a0 45 4d 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  EM ){.      sqli
196b0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
196c0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
196d0 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 66 61     }.    goto fa
196e0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
196f0 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rnal;.  }.  sqli
19700 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63  te3OsSetFullSync
19710 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
19720 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
19730 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65  );.  sqlite3OsSe
19740 74 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72  tFullSync(pPager
19750 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  ->fd, pPager->fu
19760 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c  ll_fsync);.  sql
19770 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74  ite3OsOpenDirect
19780 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ory(pPager->jfd,
19790 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
197a0 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ory);.  pPager->
197b0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
197c0 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
197d0 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
197e0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
197f0 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
19800 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
19810 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
19820 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
19830 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
19840 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
19850 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
19860 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
19870 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
19880 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
19890 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
198a0 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
198b0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
198c0 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
198d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
198e0 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
198f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
19900 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
19910 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b  mtBegin(pPager);
19920 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
19930 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
19940 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
19950 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
19960 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
19970 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
19980 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19990 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
199a0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
199b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
199c0 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
199d0 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
199e0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
199f0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
19a00 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
19a10 3d 20 30 3b 0a 23 69 66 20 30 0a 20 20 69 66 28  = 0;.#if 0.  if(
19a20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
19a30 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  M ){.    /* If t
19a40 68 69 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63  his was a malloc
19a50 28 29 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e  () failure, then
19a60 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   we will not be 
19a70 63 6c 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65  closing the page
19a80 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53  r.    ** file. S
19a90 6f 20 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75  o delete any jou
19aa0 72 6e 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79  rnal file we may
19ab0 20 68 61 76 65 20 6a 75 73 74 20 63 72 65 61 74   have just creat
19ac0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20  ed. Otherwise,. 
19ad0 20 20 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d     ** the system
19ae0 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73   will get confus
19af0 65 64 2c 20 77 65 20 68 61 76 65 20 61 20 72 65  ed, we have a re
19b00 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  ad-lock on the f
19b10 69 6c 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a  ile and a.    **
19b20 20 6d 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72   mysterious jour
19b30 6e 61 6c 20 68 61 73 20 61 70 70 65 61 72 65 64  nal has appeared
19b40 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
19b50 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2f  em..    */.    /
19b60 2a 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  * sqlite3OsDelet
19b70 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
19b80 61 6c 29 3b 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  al); */.  }else{
19b90 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 72 65  .    /* If we re
19ba0 73 65 74 20 74 68 65 20 70 61 67 65 72 20 68 65  set the pager he
19bb0 72 65 2c 20 77 65 20 77 69 6c 6c 20 64 65 6c 65  re, we will dele
19bc0 74 65 20 70 61 67 65 73 20 6f 75 74 20 66 72 6f  te pages out fro
19bd0 6d 20 75 6e 64 65 72 0a 20 20 20 20 2a 2a 20 76  m under.    ** v
19be0 61 72 69 6f 75 73 20 63 75 72 73 6f 72 73 20 61  arious cursors a
19bf0 6e 64 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65  nd will ultimate
19c00 6c 79 20 73 65 67 66 61 75 6c 74 2e 20 2a 2f 0a  ly segfault. */.
19c10 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73      /* pager_res
19c20 65 74 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  et(pPager); */. 
19c30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
19c40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19c50 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
19c60 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
19c70 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
19c80 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
19c90 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
19ca0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
19cb0 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
19cc0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
19cd0 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63  tPhaseTwo() is c
19ce0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
19cf0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
19d00 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ack() is called.
19d10 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33  .**   *  sqlite3
19d20 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20  PagerClose() is 
19d30 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
19d40 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19d50 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
19d60 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
19d70 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
19d80 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
19d90 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
19da0 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
19db0 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
19dc0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
19dd0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
19de0 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
19df0 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
19e00 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
19e10 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
19e20 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19e30 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
19e40 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
19e50 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
19e60 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
19e70 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
19e80 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
19e90 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
19ea0 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
19eb0 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
19ec0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
19ed0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
19ee0 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
19ef0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
19f00 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
19f10 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
19f20 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
19f30 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
19f40 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
19f50 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
19f60 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
19f70 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
19f80 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
19f90 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
19fa0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
19fb0 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
19fc0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
19fd0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
19fe0 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
19ff0 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
1a000 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
1a010 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
1a020 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
1a030 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
1a040 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
1a050 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
1a060 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
1a070 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
1a080 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
1a090 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
1a0a0 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
1a0b0 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
1a0c0 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
1a0d0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
1a0e0 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
1a0f0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
1a100 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62  te3PagerBegin(Db
1a110 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65  Page *pPg, int e
1a120 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20  xFlag){.  Pager 
1a130 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1a140 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1a150 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
1a160 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1a170 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1a180 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1a190 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
1a1a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1a1b0 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te==PAGER_SHARED
1a1c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a1d0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a1e0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  al==0 );.    if(
1a1f0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1a200 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1a210 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
1a220 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f  .      pPager->o
1a230 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1a240 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1a250 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1a260 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
1a270 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
1a280 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
1a290 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1a2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
1a2b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1a2c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
1a2d0 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
1a2e0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
1a2f0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1a300 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
1a310 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1a320 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a330 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
1a340 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a350 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
1a370 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1a380 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
1a390 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
1a3a0 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
1a3b0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1a3c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a3d0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
1a3e0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1a3f0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1a400 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
1a410 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1a420 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1a430 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f  e if( pPager->jo
1a440 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
1a450 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
1a460 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  =0 ){.    /* Thi
1a470 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74  s happens when t
1a480 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20  he pager was in 
1a490 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1a4a0 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a   mode last.    *
1a4b0 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
1a4c0 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
1a4d0 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
1a4e0 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
1a4f0 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
1a500 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
1a510 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
1a520 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a530 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
1a540 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75  ept open and tru
1a550 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65  ncated to 0 byte
1a560 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
1a570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1a580 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ec==0 );.    ass
1a590 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69  ert( pPager->ori
1a5a0 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20  gDbSize==0 );.  
1a5b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a5c0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
1a5d0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
1a5e0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1a5f0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
1a600 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1a610 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1a620 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1a630 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  1 );.    if( !pP
1a640 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a650 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1a660 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1a670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1a680 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1a690 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1a6a0 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72  e;.      rc = wr
1a6b0 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
1a6c0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
1a6d0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1a6e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a6f0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1a700 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53  alOff>0 || rc!=S
1a710 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65  QLITE_OK );.  re
1a720 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1a730 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69  * Make a page di
1a740 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69  rty.  Set its di
1a750 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64  rty flag and add
1a760 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79   it to the dirty
1a770 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  .** page list..*
1a780 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1a790 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70  keDirty(PgHdr *p
1a7a0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1a7b0 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20  dirty==0 ){.    
1a7c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1a7d0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
1a7e0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
1a7f0 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
1a800 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74   = pPager->pDirt
1a810 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  y;.    if( pPage
1a820 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20  r->pDirty ){.   
1a830 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
1a840 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
1a850 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  pPg;.    }.    p
1a860 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  Pg->pPrevDirty =
1a870 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
1a880 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20  pDirty = pPg;.  
1a890 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  }.}../*.** Make 
1a8a0 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43  a page clean.  C
1a8b0 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62  lear its dirty b
1a8c0 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74  it and remove it
1a8d0 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72   from the.** dir
1a8e0 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ty page list..*/
1a8f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
1a900 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50  eClean(PgHdr *pP
1a910 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
1a920 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d  irty ){.    pPg-
1a930 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1a940 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20  if( pPg->pDirty 
1a950 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44  ){.      pPg->pD
1a960 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
1a970 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72   = pPg->pPrevDir
1a980 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ty;.    }.    if
1a990 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
1a9a0 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  y ){.      pPg->
1a9b0 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72  pPrevDirty->pDir
1a9c0 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  ty = pPg->pDirty
1a9d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a9e0 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
1a9f0 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
1aa00 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  irty;.    }.  }.
1aa10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  }.../*.** Mark a
1aa20 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
1aa30 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
1aa40 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
1aa50 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
1aa60 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
1aa70 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
1aa80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
1aa90 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
1aaa0 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
1aab0 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
1aac0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
1aad0 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
1aae0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
1aaf0 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
1ab00 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
1ab10 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
1ab20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
1ab30 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1ab40 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
1ab50 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
1ab60 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
1ab70 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1ab80 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
1ab90 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
1aba0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
1abb0 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
1abc0 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
1abd0 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
1abe0 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
1abf0 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
1ac00 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1ac10 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
1ac20 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
1ac30 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
1ac40 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
1ac50 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
1ac60 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
1ac70 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1ac80 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
1ac90 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
1aca0 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
1acb0 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
1acc0 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
1acd0 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
1ace0 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
1acf0 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
1ad00 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1ad10 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  Commit() or sqli
1ad20 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
1ad30 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a  () to.** reset..
1ad40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1ad50 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
1ad60 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
1ad70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Data = PGHDR_TO_
1ad80 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67  DATA(pPg);.  Pag
1ad90 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
1ada0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
1adb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1adc0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
1add0 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
1ade0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
1adf0 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  e ){ .    return
1ae00 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ae10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1ae20 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  er->readOnly ){.
1ae30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1ae40 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61  E_PERM;.  }..  a
1ae50 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1ae60 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20  setMaster );..  
1ae70 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b  CHECK_PAGE(pPg);
1ae80 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1ae90 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
1aea0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
1aeb0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1aec0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1aed0 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
1aee0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
1aef0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
1af00 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
1af10 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
1af20 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53  nal && (pPg->inS
1af30 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  tmt || pPager->s
1af40 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  tmtInUse==0) ){.
1af50 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1af60 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65  yCache = 1;.  }e
1af70 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
1af80 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
1af90 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1afa0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
1afb0 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
1afc0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
1afd0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
1afe0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
1aff0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
1b000 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
1b010 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
1b020 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
1b030 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
1b040 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
1b050 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
1b060 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
1b070 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1b080 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1b090 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1b0a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1b0b0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70  ite3PagerBegin(p
1b0c0 50 67 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  Pg, 0);.    if( 
1b0d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1b0e0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1b0f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
1b100 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1b110 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1b120 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50  D );.    if( !pP
1b130 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b140 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  n && pPager->use
1b150 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
1b160 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
1b170 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
1b180 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b190 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b1a0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1b1b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b1c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
1b1d0 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72  !pPager->useJour
1b1e0 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
1b1f0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1b200 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68 65  1;.  .    /* The
1b210 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1b220 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73 20  rnal now exists 
1b230 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52 45  and we have a RE
1b240 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20 20  SERVED or an.   
1b250 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
1b260 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
1b270 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 57  atabase file.  W
1b280 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
1b290 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20   page to.    ** 
1b2a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1b2b0 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69 73  journal if it is
1b2c0 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
1b2d0 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  dy..    */.    i
1b2e0 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1b2f0 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e 75  al && (pPager->u
1b300 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d  seJournal || MEM
1b310 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28  DB) ){.      if(
1b320 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20   (int)pPg->pgno 
1b330 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  <= pPager->origD
1b340 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  bSize ){.       
1b350 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20 20   int szPg;.     
1b360 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1b370 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74            PgHist
1b380 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1b390 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1b3a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1b3b0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1b3c0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
1b3d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1b3e0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1b3f0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  o);.          as
1b400 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
1b410 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
1b420 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
1b430 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1b440 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
1b450 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
1b460 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
1b470 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
1b480 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
1b490 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Orig, PGHDR_TO_D
1b4a0 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
1b4b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1b4c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1b4d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1b4e0 20 20 75 33 32 20 63 6b 73 75 6d 2c 20 73 61 76    u32 cksum, sav
1b4f0 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  ed;.          ch
1b500 61 72 20 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e  ar *pData2, *pEn
1b510 64 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;.          /* 
1b520 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
1b530 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
1b540 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
1b550 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
1b560 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
1b570 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
1b580 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1b590 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
1b5a0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
1b5b0 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
1b5c0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1b5d0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
1b5e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1b5f0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
1b600 20 70 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32   pData2 = CODEC2
1b610 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
1b620 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
1b630 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
1b640 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
1b650 67 65 72 2c 20 28 75 38 2a 29 70 44 61 74 61 32  ger, (u8*)pData2
1b660 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 6e  );.          pEn
1b670 64 20 3d 20 70 44 61 74 61 32 20 2b 20 70 50 61  d = pData2 + pPa
1b680 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
1b690 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20           pData2 
1b6a0 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20  -= 4;.          
1b6b0 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 70  saved = *(u32*)p
1b6c0 45 6e 64 3b 0a 20 20 20 20 20 20 20 20 20 20 70  End;.          p
1b6d0 75 74 33 32 62 69 74 73 28 70 45 6e 64 2c 20 63  ut32bits(pEnd, c
1b6e0 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
1b6f0 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e   szPg = pPager->
1b700 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
1b710 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1b720 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e  pData2, pPg->pgn
1b730 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
1b740 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
1b750 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  e(pPager->jfd, p
1b760 44 61 74 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20  Data2, szPg);.  
1b770 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
1b780 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
1b790 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
1b7a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20   pPg->pgno,.    
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b7c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1b7d0 66 2c 20 73 7a 50 67 29 29 0a 20 20 20 20 20 20  f, szPg)).      
1b7e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1b7f0 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a  nalOff += szPg;.
1b800 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
1b810 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE4("JOURNAL %
1b820 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
1b830 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
1b840 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1b850 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1b860 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1b870 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20  dSync);.        
1b880 20 20 2a 28 75 33 32 2a 29 70 45 6e 64 20 3d 20    *(u32*)pEnd = 
1b890 73 61 76 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e  saved;...  /* An
1b8a0 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
1b8b0 65 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  ed writing to th
1b8c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
1b8d0 54 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a  The .          *
1b8e0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  * transaction wi
1b8f0 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
1b900 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61  k by the layer a
1b910 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  bove..          
1b920 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
1b930 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b940 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
1b950 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1b960 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
1b970 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
1b980 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1b990 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
1b9a0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
1b9b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1b9c0 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1b9d0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1b9e0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
1b9f0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1ba00 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
1ba10 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
1ba20 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1ba30 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
1ba40 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1ba50 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1ba60 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1ba70 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1ba80 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
1ba90 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
1baa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bab0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
1bac0 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  .        pPg->ne
1bad0 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
1bae0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
1baf0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
1bb00 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47  ync;.        PAG
1bb10 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44  ERTRACE4("APPEND
1bb20 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
1bb30 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
1bb40 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
1bb50 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1bb60 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1bb70 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  dSync);.      }.
1bb80 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
1bb90 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
1bba0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1bbb0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
1bbc0 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
1bbd0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
1bbe0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
1bbf0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1bc00 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
1bc10 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1bc20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
1bc30 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
1bc40 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
1bc50 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1bc60 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
1bc70 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
1bc80 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
1bc90 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
1bca0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
1bcb0 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
1bcc0 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
1bcd0 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
1bce0 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
1bcf0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1bd00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1bd10 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
1bd20 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
1bd30 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1bd40 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  mtSize ){.      
1bd50 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1bd60 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1bd70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1bd80 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1bd90 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
1bda0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
1bdb0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
1bdc0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
1bdd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
1bde0 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
1bdf0 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1be00 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
1be10 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
1be20 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
1be30 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
1be40 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1be50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1be60 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
1be70 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
1be80 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1be90 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1bea0 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
1beb0 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
1bec0 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
1bed0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1bee0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
1bef0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1bf00 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1bf10 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
1bf20 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
1bf30 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20  >pgno, 7)-4;.   
1bf40 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1bf50 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f  Data2, pPg->pgno
1bf60 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1bf70 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1bf80 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61  Pager->stfd, pDa
1bf90 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1bfa0 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20  eSize+4);.      
1bfb0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
1bfc0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
1bfd0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1bfe0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1bff0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
1c000 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c010 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1c020 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1c030 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
1c040 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a  er->stmtNRec++;.
1c050 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1c060 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
1c070 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
1c080 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1c090 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1c0a0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1c0b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61        }.      pa
1c0c0 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1c0d0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
1c0e0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
1c0f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1c100 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
1c110 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1c120 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1c130 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
1c140 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1c150 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
1c160 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1c170 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
1c180 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
1c190 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
1c1a0 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
1c1b0 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
1c1c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
1c1d0 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
1c1e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1c1f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1c200 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c210 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
1c220 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
1c230 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
1c240 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
1c250 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
1c260 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
1c270 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1c280 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
1c290 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
1c2a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
1c2b0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1c2c0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1c2d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
1c2e0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
1c2f0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
1c300 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
1c310 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1c320 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
1c330 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
1c340 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
1c350 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
1c360 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
1c370 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
1c380 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
1c390 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1c3a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
1c3b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1c3c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1c3d0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
1c3e0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
1c3f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c400 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
1c410 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
1c420 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c430 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
1c440 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
1c450 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
1c460 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
1c470 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21  eSize);..  if( !
1c480 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65  MEMDB && nPagePe
1c490 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
1c4a0 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
1c4b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1c4c0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1c4d0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1c4e0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
1c4f0 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
1c500 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
1c510 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1c520 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1c530 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
1c540 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1c550 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c560 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
1c570 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
1c580 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
1c590 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  i;..    /* Set t
1c5a0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
1c5b0 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
1c5c0 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
1c5d0 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61  t allow a journa
1c5e0 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20  l.    ** header 
1c5f0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
1c600 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
1c610 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69  journaled by thi
1c620 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
1c630 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1c640 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1c650 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1c660 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
1c670 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
1c680 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
1c690 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
1c6a0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
1c6b0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
1c6c0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
1c6d0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
1c6e0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
1c6f0 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
1c700 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
1c710 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1c720 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1c730 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
1c740 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
1c750 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
1c760 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
1c770 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
1c780 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  unt = sqlite3Pag
1c790 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1c7a0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  er);.    if( pPg
1c7b0 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
1c7c0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
1c7d0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
1c7e0 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
1c7f0 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
1c800 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
1c810 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1c820 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f   nPage = nPageCo
1c830 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d  unt+1-pg1;.    }
1c840 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
1c850 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74  e = nPagePerSect
1c860 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
1c870 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20  sert(nPage>0);. 
1c880 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
1c890 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
1c8a0 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
1c8b0 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
1c8c0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1c8d0 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
1c8e0 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
1c8f0 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70       Pgno pg = p
1c900 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69 66 28  g1+ii;.      if(
1c910 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
1c920 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d  rnal || pg==pPg-
1c930 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20  >pgno || .      
1c940 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f      pg>pPager->o
1c950 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70  rigDbSize || !(p
1c960 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1c970 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26  l[pg/8]&(1<<(pg&
1c980 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20  7))).      ) {. 
1c990 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
1c9a0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1c9b0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
1c9c0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
1c9d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1c9e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1c9f0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
1ca00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1ca10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ca20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1ca30 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1ca40 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1ca50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1ca60 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
1ca70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1ca80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ca90 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1caa0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1cab0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
1cac0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
1cad0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1cae0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1caf0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
1cb00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1cb10 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1cb20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
1cb30 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1cb40 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
1cb50 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
1cb60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1cb70 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
1cb80 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
1cb90 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
1cba0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
1cbb0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1cbc0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1cbd0 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
1cbe0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1cbf0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
1cc00 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
1cc10 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
1cc20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cc30 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65  _VACUUM./*.** Re
1cc40 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
1cc50 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
1cc60 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
1cc70 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
1cc80 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
1cc90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1cca0 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50  PagerOverwrite(P
1ccb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1ccc0 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
1ccd0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
1cce0 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
1ccf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1cd00 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
1cd10 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  gno, &pPg);.  if
1cd20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1cd30 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1cd40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1cd50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
1cd60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cd70 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
1cd80 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
1cd90 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  g), pData, pPage
1cda0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1cdb0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
1cdc0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1cdd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1cde0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1cdf0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1ce00 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1ce10 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
1ce20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1ce30 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
1ce40 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
1ce50 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b  page "pgno" back
1ce60 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76   to the disk, ev
1ce70 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61  en though.** tha
1ce80 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65 20  t page might be 
1ce90 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e  marked as dirty.
1cea0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c  .**.** The overl
1ceb0 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61  ying software la
1cec0 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72  yer calls this r
1ced0 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20  outine when all 
1cee0 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f  of the data.** o
1cef0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1cf00 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65   is unused.  The
1cf10 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
1cf20 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
1cf30 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
1cf40 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
1cf50 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
1cf60 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
1cf70 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
1cf80 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74  on, together wit
1cf90 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  h the.** sqlite3
1cfa0 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1cfb0 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
1cfc0 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
1cfd0 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
1cfe0 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
1cff0 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
1d000 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
1d010 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
1d020 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
1d030 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
1d040 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
1d050 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
1d060 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
1d070 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
1d080 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1d090 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20  lback() for the 
1d0a0 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c  same page.** wil
1d0b0 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65 20  l thereafter be 
1d0c0 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
1d0d0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61  s necessary to a
1d0e0 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a  void a problem.*
1d0f0 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20 77  * where a page w
1d100 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64 65  ith data is adde
1d110 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1d120 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72  t during one par
1d130 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61  t of.** a transa
1d140 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76  ction then remov
1d150 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ed from the free
1d160 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61  list during a la
1d170 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74  ter part.** of t
1d180 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
1d190 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66  ion and reused f
1d1a0 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75  or some other pu
1d1b0 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a  rpose.  When it.
1d1c0 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64 65  ** is first adde
1d1d0 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  d to the freelis
1d1e0 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
1d1f0 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e  is called.  When
1d200 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20   reused,.** the 
1d210 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1d220 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  Rollback() routi
1d230 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
1d240 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ut because the.*
1d250 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  * page contains 
1d260 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
1d270 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
1d280 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 0a  be sure it gets.
1d290 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ** rolled back i
1d2a0 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20 73  n spite of the s
1d2b0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d2c0 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
1d2d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1d2e0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 50 61  agerDontWrite(Pa
1d2f0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
1d300 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1d310 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45   *pPg;..  if( ME
1d320 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  MDB ) return;.. 
1d330 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
1d340 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1d350 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1d360 21 3d 30 20 29 3b 20 20 2f 2a 20 57 65 20 6e 65  !=0 );  /* We ne
1d370 76 65 72 20 63 61 6c 6c 20 5f 64 6f 6e 74 5f 77  ver call _dont_w
1d380 72 69 74 65 20 75 6e 6c 65 73 73 20 74 68 65 20  rite unless the 
1d390 70 61 67 65 20 69 73 20 69 6e 20 6d 65 6d 20 2a  page is in mem *
1d3a0 2f 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  /.  pPg->alwaysR
1d3b0 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
1d3c0 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
1d3d0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1d3e0 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
1d3f0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1d400 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
1d410 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1d420 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
1d430 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
1d440 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
1d450 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
1d460 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
1d470 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
1d480 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
1d490 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
1d4a0 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
1d4b0 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
1d4c0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
1d4d0 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
1d4e0 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
1d4f0 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
1d500 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
1d510 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
1d520 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
1d530 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
1d540 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
1d550 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
1d560 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
1d570 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
1d580 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
1d590 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
1d5a0 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
1d5b0 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
1d5c0 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
1d5d0 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
1d5e0 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
1d5f0 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
1d600 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
1d610 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
1d620 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
1d630 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
1d640 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
1d650 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
1d660 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
1d670 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52  RTRACE3("DONT_WR
1d680 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
1d690 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45  d\n", pgno, PAGE
1d6a0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1d6b0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
1d6c0 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
1d6d0 61 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20  ager, pgno)).   
1d6e0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1d6f0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1d700 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1d710 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1d720 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1d730 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1d740 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1d750 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1d760 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1d770 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
1d780 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1d790 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
1d7a0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
1d7b0 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
1d7c0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1d7d0 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
1d7e0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1d7f0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
1d800 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
1d810 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
1d820 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1d830 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
1d840 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1d850 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
1d860 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
1d870 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1d880 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1d890 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1d8a0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
1d8b0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1d8c0 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75  alOpen==0 ) retu
1d8d0 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61  rn;.  if( pPg->a
1d8e0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1d8f0 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
1d900 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42  ollback || MEMDB
1d910 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1d920 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c   !pPg->inJournal
1d930 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
1d940 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
1d950 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
1d960 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d970 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1d980 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1d990 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
1d9a0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1d9b0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50  >pgno&7);.    pP
1d9c0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1d9d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1d9e0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1d9f0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
1da00 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1da10 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1da20 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67  no&7);.      pag
1da30 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
1da40 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
1da50 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1da60 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61  DONT_ROLLBACK pa
1da70 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
1da80 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
1da90 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1daa0 20 49 4f 54 52 41 43 45 28 28 22 47 41 52 42 41   IOTRACE(("GARBA
1dab0 47 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  GE %p %d\n", pPa
1dac0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
1dad0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1dae0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
1daf0 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
1db00 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
1db10 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1db20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1db30 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
1db40 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
1db50 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
1db60 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
1db70 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
1db80 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  mt!=0 );.    pPa
1db90 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1dba0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1dbb0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1dbc0 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
1dbd0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
1dbe0 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
1dbf0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1dc00 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
1dc10 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dc20 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
1dc30 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
1dc40 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
1dc50 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
1dc60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
1dc70 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1dc80 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
1dc90 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
1dca0 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1dcb0 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1dcc0 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
1dcd0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1dce0 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  ne ){.    /* Ope
1dcf0 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
1dd00 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
1dd10 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1dd20 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1dd30 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
1dd40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1dd50 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1dd60 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
1dd70 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1dd80 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  (pPgHdr);.    if
1dd90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1dda0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a  ) return rc;.  .
1ddb0 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1ddc0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1ddd0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1dde0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1ddf0 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
1de00 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 20 20  (pPgHdr, 24);.  
1de10 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1de20 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1de30 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1de40 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1de50 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
1de60 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
1de70 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1de80 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
1de90 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
1dea0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1deb0 20 20 20 70 50 61 67 65 72 2d 3e 69 43 68 61 6e     pPager->iChan
1dec0 67 65 43 6f 75 6e 74 20 3d 20 63 68 61 6e 67 65  geCount = change
1ded0 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 0a 20 20 20  _counter;.  .   
1dee0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1def0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1df00 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
1df10 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
1df20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
1df30 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1df40 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1df50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1df60 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1df70 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1df80 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1df90 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1dfa0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1dfb0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1dfc0 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1dfd0 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1dfe0 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1dff0 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1e000 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1e010 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1e020 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1e030 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1e040 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1e050 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1e060 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1e070 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1e080 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1e090 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1e0a0 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1e0b0 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1e0c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1e0d0 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1e0e0 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1e0f0 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1e100 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1e110 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1e120 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1e130 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1e140 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1e150 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1e160 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1e170 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1e180 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1e190 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1e1a0 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1e1b0 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1e1c0 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
1e1d0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1e1e0 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
1e1f0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1e200 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1e210 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1e220 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1e230 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1e240 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1e250 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1e260 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1e270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1e280 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1e290 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1e2a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1e2b0 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63  ter, Pgno nTrunc
1e2c0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1e2d0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45  LITE_OK;..  PAGE
1e2e0 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53  RTRACE4("DATABAS
1e2f0 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
1e300 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
1e310 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
1e320 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1e330 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
1e340 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
1e350 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1e360 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
1e370 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
1e380 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
1e390 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
1e3a0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1e3b0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
1e3c0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1e3d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1e3e0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
1e3f0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1e400 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
1e410 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
1e420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1e430 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1e440 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
1e450 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1e460 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
1e470 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e480 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
1e490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1e4a0 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
1e4b0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
1e4c0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
1e4d0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
1e4e0 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1e4f0 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
1e500 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1e510 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1e520 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1e530 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1e540 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1e550 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1e560 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1e570 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1e580 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1e590 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1e5a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1e5b0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1e5c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1e5d0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1e5e0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
1e5f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1e600 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1e610 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
1e620 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1e630 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
1e640 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1e650 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1e660 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1e670 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1e680 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1e690 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1e6a0 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1e6b0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1e6c0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1e6d0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1e6e0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1e6f0 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
1e700 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1e710 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  o i;.        int
1e720 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
1e730 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a  J_PGNO(pPager);.
1e740 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
1e750 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
1e760 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
1e770 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
1e780 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61   if( !(pPager->a
1e790 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26  InJournal[i/8] &
1e7a0 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20   (1<<(i&7))) && 
1e7b0 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
1e7c0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e7d0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1e7e0 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20  ger, i, &pPg);. 
1e7f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1e800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1e810 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1e820 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1e830 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e840 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
1e850 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1e860 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1e870 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1e880 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e890 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1e8a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e8b0 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1e8c0 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1e8d0 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1e8e0 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1e8f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e900 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e910 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1e920 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1e930 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1e940 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e950 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1e960 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1e970 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1e980 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1e990 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1e9a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e9b0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
1e9c0 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
1e9d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1e9e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1e9f0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1ea00 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
1ea10 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
1ea20 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
1ea30 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1ea40 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
1ea50 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
1ea60 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
1ea70 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1ea80 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
1ea90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1eaa0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1eab0 63 5f 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67  c_exit;.    pPag
1eac0 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
1ead0 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
1eae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1eaf0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1eb00 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
1eb10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eb20 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
1eb30 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  d, 0);.    }.   
1eb40 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e   IOTRACE(("DBSYN
1eb50 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1eb60 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  )..    pPager->s
1eb70 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
1eb80 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CED;.  }else if(
1eb90 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63   MEMDB && nTrunc
1eba0 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
1ebb0 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
1ebc0 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1ebd0 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
1ebe0 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  exit:.  return r
1ebf0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
1ec00 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
1ec10 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1ec20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
1ec30 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
1ec40 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
1ec50 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
1ec60 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
1ec70 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
1ec80 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
1ec90 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1eca0 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
1ecb0 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
1ecc0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
1ecd0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1ece0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1ecf0 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50 61  seTwo(Pager *pPa
1ed00 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1ed10 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1ed20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1ed30 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Code ){.    retu
1ed40 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
1ed50 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
1ed60 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
1ed70 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
1ed80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ed90 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47  ERROR;.  }.  PAG
1eda0 45 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54  ERTRACE2("COMMIT
1edb0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1edc0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
1edd0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67  MEMDB ){.    pPg
1ede0 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
1edf0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
1ee00 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  ger);.    while(
1ee10 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c   pPg ){.      cl
1ee20 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52  earHistory(PGHDR
1ee30 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1ee40 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50  ager));.      pP
1ee50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
1ee60 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1ee70 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
1ee80 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
1ee90 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1eea0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  nc = 0;.      pP
1eeb0 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
1eec0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
1eed0 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
1eee0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
1eef0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
1ef00 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65  irty = 0;.#ifnde
1ef10 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
1ef20 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
1ef30 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
1ef40 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1ef50 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1ef60 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1ef70 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1ef80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1ef90 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1efa0 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
1efb0 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
1efc0 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
1efd0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
1efe0 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
1eff0 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
1f000 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
1f010 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1f020 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
1f030 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f040 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1f050 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1f060 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  en || !pPager->d
1f070 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 61  irtyCache );.  a
1f080 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f090 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
1f0a0 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64  ED || !pPager->d
1f0b0 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72  irtyCache );.  r
1f0c0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1f0d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1f0e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65  );.  return page
1f0f0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1f100 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  rc);.}../*.** Ro
1f110 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67  llback all chang
1f120 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  es.  The databas
1f130 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20  e falls back to 
1f140 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64  PAGER_SHARED mod
1f150 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d  e..** All in-mem
1f160 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20  ory cache pages 
1f170 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20  revert to their 
1f180 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f  original data co
1f190 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a  ntents..** The j
1f1a0 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65  ournal is delete
1f1b0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
1f1c0 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69  utine cannot fai
1f1d0 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  l unless some ot
1f1e0 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
1f1f0 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  ot following.** 
1f200 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b  the correct lock
1f210 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72 20  ing protocol or 
1f220 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65  unless some othe
1f230 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20  r.** process is 
1f240 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e  writing trash in
1f250 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1f260 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52  ile (SQLITE_CORR
1f270 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73  UPT) or.** unles
1f280 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63  s a prior malloc
1f290 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54  () failed (SQLIT
1f2a0 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f  E_NOMEM).  Appro
1f2b0 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20  priate error.** 
1f2c0 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e  codes are return
1f2d0 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65  ed for all these
1f2e0 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68   occasions.  Oth
1f2f0 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54  erwise,.** SQLIT
1f300 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
1f310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f320 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50 61  PagerRollback(Pa
1f330 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1f340 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52 54  int rc;.  PAGERT
1f350 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE2("ROLLBACK 
1f360 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1f370 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1f380 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48 64  EMDB ){.    PgHd
1f390 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  r *p;.    for(p=
1f3a0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
1f3b0 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
1f3c0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
1f3d0 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61   *pHist;.      a
1f3e0 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79  ssert( !p->alway
1f3f0 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1f400 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79     if( !p->dirty
1f410 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
1f420 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
1f430 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
1f440 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f  (p, pPager))->pO
1f450 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61  rig );.        a
1f460 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
1f470 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
1f480 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
1f490 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  >pStmt );.      
1f4a0 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
1f4b0 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74    }..      pHist
1f4c0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1f4d0 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  (p, pPager);.   
1f4e0 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f     if( pHist->pO
1f4f0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  rig ){.        m
1f500 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
1f510 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70  ATA(p), pHist->p
1f520 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  Orig, pPager->pa
1f530 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
1f540 20 50 41 47 45 52 54 52 41 43 45 33 28 22 52 4f   PAGERTRACE3("RO
1f550 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f  LLBACK-PAGE %d o
1f560 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  f %d\n", p->pgno
1f570 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1f580 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
1f590 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1f5a0 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73  ACE3("PAGE %d is
1f5b0 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c   clean on %d\n",
1f5c0 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
1f5d0 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1f5e0 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48    }.      clearH
1f5f0 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
1f600 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20       p->dirty = 
1f610 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f  0;.      p->inJo
1f620 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
1f630 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a   p->inStmt = 0;.
1f640 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74        p->pPrevSt
1f650 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d  mt = p->pNextStm
1f660 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1f670 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
1f680 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
1f690 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
1f6a0 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  p, pPager->pageS
1f6b0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
1f6c0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
1f6d0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
1f6e0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1f6f0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
1f700 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1f710 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
1f720 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1f730 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1f740 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1f750 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1f760 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1f770 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1f780 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1f790 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
1f7a0 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
1f7b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1f7c0 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
1f7d0 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
1f7e0 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ion(pPager);.   
1f7f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1f800 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1f810 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1f820 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1f830 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66  E_FULL ){.    if
1f840 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1f850 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
1f860 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1f870 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
1f880 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   0);.    }.    r
1f890 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
1f8a0 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28  rCode;.  }.  if(
1f8b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
1f8c0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1f8d0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
1f8e0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1f8f0 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30  ayback(pPager, 0
1f900 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
1f910 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1f920 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
1f930 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1f940 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1f950 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  rc2;.    }.  }el
1f960 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
1f970 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1f980 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 50  er, 0);.  }.  pP
1f990 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
1f9a0 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
1f9b0 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
1f9c0 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
1f9d0 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
1f9e0 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
1f9f0 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
1fa00 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
1fa10 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
1fa20 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
1fa30 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
1fa40 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ent..  */.  retu
1fa50 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
1fa60 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
1fa70 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1fa80 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
1fa90 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
1faa0 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
1fab0 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
1fac0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
1fad0 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
1fae0 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
1faf0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
1fb00 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
1fb10 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1fb20 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
1fb30 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1fb40 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
1fb50 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1fb60 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
1fb70 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
1fb80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1fb90 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1fba0 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65  ->nRef;.}..#ifde
1fbb0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1fbc0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fbd0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
1fbe0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
1fbf0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
1fc00 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
1fc10 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
1fc20 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
1fc30 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
1fc40 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
1fc50 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
1fc60 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
1fc70 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
1fc80 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
1fc90 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
1fca0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
1fcb0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
1fcc0 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
1fcd0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
1fce0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
1fcf0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
1fd00 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
1fd10 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
1fd20 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
1fd30 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
1fd40 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
1fd50 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
1fd60 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
1fd70 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
1fd80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1fd90 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
1fda0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
1fdb0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1fdc0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
1fdd0 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
1fde0 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
1fdf0 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
1fe00 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
1fe10 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
1fe20 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
1fe30 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
1fe40 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
1fe50 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
1fe60 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
1fe70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1fe80 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
1fe90 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
1fea0 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
1feb0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1fec0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1fed0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1fee0 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
1fef0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
1ff00 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
1ff10 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1ff20 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
1ff30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1ff40 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
1ff50 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
1ff60 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1ff70 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
1ff80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ff90 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1ffa0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
1ffb0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
1ffc0 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
1ffd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ffe0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1fff0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20000 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  pen );.  pPager-
20010 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74  >aInStmt = sqlit
20020 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d  eMalloc( pPager-
20030 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b  >dbSize/8 + 1 );
20040 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
20050 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20  InStmt==0 ){.   
20060 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   /* sqlite3OsLoc
20070 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
20080 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20  ARED_LOCK); */. 
20090 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
200a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
200b0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
200c0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
200d0 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
200e0 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53   &pPager->stmtJS
200f0 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
20100 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
20110 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72  _failed;.  asser
20120 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  t( pPager->stmtJ
20130 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e  Size == pPager->
20140 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65  journalOff );.#e
20150 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73  ndif.  pPager->s
20160 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
20170 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
20180 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
20190 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
201a0 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
201b0 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
201c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
201d0 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
201e0 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
201f0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
20200 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
20210 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
20220 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
20230 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
20240 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
20250 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
20260 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
20270 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
20280 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
20290 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
202a0 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
202b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
202c0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
202d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
202e0 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
202f0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
20300 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
20310 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
20320 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20330 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
20340 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
20350 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
20360 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61  gerStmtCommit(Pa
20370 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
20380 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
20390 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48  InUse ){.    PgH
203a0 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
203b0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
203c0 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
203d0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
203e0 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
203f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
20400 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
20410 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
20420 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f       /* sqlite3O
20430 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
20440 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
20450 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
20460 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
20470 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
20480 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
20490 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67     }.    for(pPg
204a0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
204b0 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
204c0 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
204d0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
204e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
204f0 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
20500 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
20510 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
20520 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
20530 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
20540 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
20550 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
20560 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
20570 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
20580 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
20590 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
205a0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
205b0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
205c0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
205d0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
205e0 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
205f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
20600 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
20610 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
20620 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
20630 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
20640 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
20660 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
20670 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
20680 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
20690 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
206a0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
206b0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
206c0 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54  se ){.    PAGERT
206d0 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c  RACE2("STMT-ROLL
206e0 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
206f0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
20700 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
20710 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
20720 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
20730 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
20740 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
20750 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20  tStmt){.        
20760 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
20770 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
20780 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
20790 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
207a0 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
207b0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
207c0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
207d0 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50  pHist->pStmt, pP
207e0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
207f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20800 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
20810 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  mt);.          p
20820 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
20830 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20840 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
20850 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
20860 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20  ->stmtSize;.    
20870 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
20880 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
20890 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
208a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
208b0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
208c0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
208d0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
208e0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
208f0 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
20900 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
20910 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
20920 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
20930 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
20940 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20950 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
20960 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
20970 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
20980 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
20990 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
209a0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
209b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
209c0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
209d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
209e0 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
209f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20a00 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
20a10 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69   *sqlite3PagerDi
20a20 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
20a30 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
20a40 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
20a50 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
20a60 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
20a70 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
20a80 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
20a90 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
20aa0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
20ab0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
20ac0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
20ad0 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
20ae0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
20af0 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
20b00 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
20b10 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
20b20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
20b30 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
20b40 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
20b50 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
20b60 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
20b70 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
20b80 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
20b90 53 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Sync;.}../*.** S
20ba0 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
20bb0 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
20bc0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
20bd0 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
20be0 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
20bf0 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
20c00 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
20c10 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
20c20 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
20c30 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
20c40 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
20c50 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
20c60 41 72 67 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  Arg;.}..#ifndef 
20c70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
20c80 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
20c90 65 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  e the page ident
20ca0 69 66 69 65 64 20 62 79 20 70 44 61 74 61 20 74  ified by pData t
20cb0 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
20cc0 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a  in the file. .**
20cd0 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62  .** There must b
20ce0 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20  e no references 
20cf0 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  to the current p
20d00 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72  age pgno. If cur
20d10 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e  rent page.** pgn
20d20 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  o is not already
20d30 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
20d40 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20   journal, it is 
20d50 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65 72  not written ther
20d60 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20  e by.** by this 
20d70 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d  routine. The sam
20d80 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65  e applies to the
20d90 20 70 61 67 65 20 70 44 61 74 61 20 72 65 66 65   page pData refe
20da0 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74  rs to on entry t
20db0 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  o.** this routin
20dc0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e  e..**.** Referen
20dd0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20  ces to the page 
20de0 72 65 66 65 72 65 64 20 74 6f 20 62 79 20 70 44  refered to by pD
20df0 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64  ata remain valid
20e00 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a  . Updating any.*
20e10 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f  * meta-data asso
20e20 63 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65  ciated with page
20e30 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74   pData (i.e. dat
20e40 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
20e50 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
20e60 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
20e70 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
20e80 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
20e90 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
20ea0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
20eb0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
20ec0 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
20ed0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
20ee0 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
20ef0 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
20f00 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
20f10 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
20f20 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
20f30 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
20f40 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
20f50 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
20f60 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
20f70 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
20f80 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
20f90 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
20fa0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
20fb0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50  3PagerMovepage(P
20fc0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62  ager *pPager, Db
20fd0 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20  Page *pPg, Pgno 
20fe0 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
20ff0 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68  pPgOld; .  int h
21000 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e  ;.  Pgno needSyn
21010 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73  cPgno = 0;..  as
21020 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
21030 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  0 );..  PAGERTRA
21040 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67  CE5("MOVE %d pag
21050 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25  e %d (needSync=%
21060 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e  d) moves to %d\n
21070 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49  ", .      PAGERI
21080 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
21090 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
210a0 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f  ync, pgno);.  IO
210b0 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20  TRACE(("MOVE %p 
210c0 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %d %d\n", pPager
210d0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e  , pPg->pgno, pgn
210e0 6f 29 29 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e  o))..  if( pPg->
210f0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
21100 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
21110 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
21120 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
21130 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
21140 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  rt( pPg->dirty )
21150 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
21160 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
21170 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
21180 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73  nk pPg from it's
21190 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20   hash-chain */. 
211a0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
211b0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a  (pPager, pPg);..
211c0 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68    /* If the cach
211d0 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67  e contains a pag
211e0 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62  e with page-numb
211f0 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20  er pgno, remove 
21200 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27  it.  ** from it'
21210 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
21220 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64 72  so, if the PgHdr
21230 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73 65  .needSync was se
21240 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65  t for .  ** page
21250 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65   pgno before the
21260 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f   'move' operatio
21270 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  n, it needs to b
21280 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a  e retained .  **
21290 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f   for the page mo
212a0 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a  ved there..  */.
212b0 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
212c0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
212d0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
212e0 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Old ){.    asser
212f0 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d  t( pPgOld->nRef=
21300 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b  =0 );.    unlink
21310 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
21320 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d  , pPgOld);.    m
21330 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29  akeClean(pPgOld)
21340 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64  ;.    if( pPgOld
21350 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
21360 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
21370 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b  ld->inJournal );
21380 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
21390 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20  urnal = 1;.     
213a0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
213b0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
213c0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
213d0 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  nc );.    }.  }.
213e0 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65  .  /* Change the
213f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
21400 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20   pPg and insert 
21410 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20  it into the new 
21420 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash-chain. */. 
21430 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
21440 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   );.  pPg->pgno 
21450 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67  = pgno;.  h = pg
21460 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
21470 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50  ash-1);.  if( pP
21480 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29  ager->aHash[h] )
21490 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
214a0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
214b0 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
214c0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
214d0 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20  h[h]->pPrevHash 
214e0 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
214f0 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
21500 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
21510 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
21520 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  h] = pPg;.  pPg-
21530 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
21540 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67  .  makeDirty(pPg
21550 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72  );.  pPager->dir
21560 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20  tyCache = 1;..  
21570 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  if( needSyncPgno
21580 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65   ){.    /* If ne
21590 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f  edSyncPgno is no
215a0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
215b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65   journal file ne
215c0 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a  eds to be .    *
215d0 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  * sync()ed befor
215e0 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72  e any data is wr
215f0 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73  itten to databas
21600 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64  e file page need
21610 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a  SyncPgno..    **
21620 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73   Currently, no s
21630 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20  uch page exists 
21640 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  in the page-cach
21650 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a  e and the .    *
21660 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e  * Pager.aInJourn
21670 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20  al bit has been 
21680 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20  set. This needs 
21690 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62  to be remedied b
216a0 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a  y loading.    **
216b0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
216c0 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61  he pager-cache a
216d0 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50  nd setting the P
216e0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
216f0 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ag..    **.    *
21700 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50 61 67  * The sqlite3Pag
21710 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  erGet() call may
21720 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
21730 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
21740 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
21750 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
21760 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
21770 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
21780 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48 64 72  nt rc;.    PgHdr
21790 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
217a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
217b0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
217c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
217d0 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
217e0 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
217f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
21800 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
21810 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
21820 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
21830 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64      pPgHdr->need
21840 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50  Sync = 1;.    pP
21850 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gHdr->inJournal 
21860 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72  = 1;.    makeDir
21870 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ty(pPgHdr);.    
21880 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
21890 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a  f(pPgHdr);.  }..
218a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
218b0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
218c0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
218d0 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74 61  nter to the data
218e0 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
218f0 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
21900 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
21910 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70 50  tData(DbPage *pP
21920 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47 48  g){.  return PGH
21930 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
21940 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21950 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
21960 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
21970 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
21980 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
21990 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
219a0 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
219b0 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
219c0 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
219d0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
219e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
219f0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
21a00 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 50  return (pPager?P
21a10 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
21a20 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a 7d  g, pPager):0);.}
21a30 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
21a40 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
21a50 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
21a60 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
21a70 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
21a80 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
21a90 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
21aa0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
21ab0 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
21ac0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
21ad0 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
21ae0 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
21af0 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
21b00 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
21b10 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
21b20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
21b30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
21b40 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
21b50 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
21b60 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
21b70 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
21b80 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
21b90 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
21ba0 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
21bb0 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
21bc0 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
21bd0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
21be0 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
21bf0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
21c00 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
21c10 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
21c20 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
21c30 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
21c40 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
21c50 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
21c60 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
21c70 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
21c80 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
21c90 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
21ca0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
21cb0 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
21cc0 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
21cd0 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
21ce0 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
21cf0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
21d00 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
21d10 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
21d20 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
21d30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
21d40 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20  Mode = eMode;.  
21d50 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29  }.  return (int)
21d60 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
21d70 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65  eMode;.}..#if de
21d80 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
21d90 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
21da0 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a  QLITE_TEST)./*.*
21db0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
21dc0 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68  rent state of th
21dd0 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20  e file lock for 
21de0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
21df0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
21e00 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e  alue is one of N
21e10 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c  O_LOCK, SHARED_L
21e20 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  OCK, RESERVED_LO
21e30 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c  CK,.** PENDING_L
21e40 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56  OCK, or EXCLUSIV
21e50 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  E_LOCK..*/.int s
21e60 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73  qlite3PagerLocks
21e70 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
21e80 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  er){.  return sq
21e90 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65  lite3OsLockState
21ea0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a  (pPager->fd);.}.
21eb0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
21ec0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
21ed0 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e  * Print a listin
21ee0 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e  g of all referen
21ef0 63 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68  ced pages and th
21f00 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a  eir ref count..*
21f10 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
21f20 67 65 72 52 65 66 64 75 6d 70 28 50 61 67 65 72  gerRefdump(Pager
21f30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
21f40 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
21f50 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
21f60 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
21f70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
21f80 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
21f90 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
21fa0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
21fb0 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
21fc0 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
21fd0 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
21fe0 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
21ff0 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
22000 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
22010 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
22020 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
22030 0a                                               .