/ Hex Artifact Content
Login

Artifact c5b32e741fb73930b6ec3d886ea680a3de3be5f7:


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 33  : pager.c,v 1.33
0350: 37 20 32 30 30 37 2f 30 35 2f 30 38 20 31 34 3a  7 2007/05/08 14:
0360: 35 31 3a 33 37 20 64 72 68 20 45 78 70 20 24 0a  51:37 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 75 38  ll pages */.  u8
1b30: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1b60: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1b70: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
1b80: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
1b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ba0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
1bb0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
1bc0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
1bd0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1be0: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
1bf0: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
1c00: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
1c10: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
1c20: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
1c30: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
1c40: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
1c50: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
1c60: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
1c90: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
1ca0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
1cb0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1cd0: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
1ce0: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
1cf0: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
1d00: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
1d10: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
1d20: 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b  /.  u32 notUsed;
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73 70 61     /* Buffer spa
1d50: 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ce */.#ifdef SQL
1d60: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1d70: 20 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a    u32 pageHash;.
1d80: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67  #endif.  /* pPag
1d90: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
1da0: 65 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20  es of page data 
1db0: 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64  follow this head
1dc0: 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  er */.  /* Pager
1dd0: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
1de0: 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c   local data foll
1df0: 6f 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61  ow the page data
1e00: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f   */.};../*.** Fo
1e10: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f  r an in-memory o
1e20: 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f  nly database, so
1e30: 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61  me extra informa
1e40: 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64  tion is recorded
1e50: 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70   about.** each p
1e60: 61 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e  age so that chan
1e70: 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  ges can be rolle
1e80: 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61  d back.  (Journa
1e90: 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a  l files are not.
1ea0: 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d  ** used for in-m
1eb0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1ec0: 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  )  The following
1ed0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1ee0: 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20  added to.** the 
1ef0: 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54  end of every EXT
1f00: 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d  RA block for in-
1f10: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73  memory databases
1f20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66  ..**.** This inf
1f30: 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68  ormation could h
1f40: 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64  ave been added d
1f50: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50  irectly to the P
1f60: 67 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a  gHdr structure..
1f70: 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77  ** But then it w
1f80: 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20  ould take up an 
1f90: 65 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66  extra 8 bytes of
1fa0: 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72   storage on ever
1fb0: 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20  y PgHdr.** even 
1fc0: 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64  for disk-based d
1fd0: 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74  atabases.  Split
1fe0: 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65  ting it out save
1ff0: 73 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73  s 8 bytes.  This
2000: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61  .** is only a sa
2010: 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75  vings of 0.8% bu
2020: 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61  t those percenta
2030: 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74  ges add up..*/.t
2040: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
2050: 48 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72  History PgHistor
2060: 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74  y;.struct PgHist
2070: 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69  ory {.  u8 *pOri
2080: 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e  g;     /* Origin
2090: 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52  al page text.  R
20a0: 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f  estore to this o
20b0: 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63  n a full rollbac
20c0: 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74  k */.  u8 *pStmt
20d0: 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73  ;     /* Text as
20e0: 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62   it was at the b
20f0: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20  eginning of the 
2100: 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  current statemen
2110: 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  t */.  PgHdr *pN
2120: 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53  extStmt, *pPrevS
2130: 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66  tmt;  /* List of
2140: 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74   pages in the st
2150: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
2160: 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20  */.  u8 inStmt; 
2170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2180: 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69      /* TRUE if i
2190: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
21a0: 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 7d 3b  subjournal */.};
21b0: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20  ../*.** A macro 
21c0: 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e  used for invokin
21d0: 67 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74  g the codec if t
21e0: 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23  here is one.*/.#
21f0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
2200: 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20  _CODEC.# define 
2210: 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20  CODEC1(P,D,N,X) 
2220: 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30  if( P->xCodec!=0
2230: 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d   ){ P->xCodec(P-
2240: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
2250: 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f  ); }.# define CO
2260: 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28  DEC2(P,D,N,X) ((
2270: 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63  char*)(P->xCodec
2280: 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d  !=0?P->xCodec(P-
2290: 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58  >pCodecArg,D,N,X
22a0: 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65  ):D)).#else.# de
22b0: 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c  fine CODEC1(P,D,
22c0: 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  N,X) /* NO-OP */
22d0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
22e0: 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
22f0: 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  *)D).#endif../*.
2300: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2310: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2320: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2330: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2340: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2350: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2360: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2370: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2380: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2390: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
23a0: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
23b0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
23c0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
23d0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
23e0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
23f0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
2400: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2410: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2420: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2430: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2440: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2450: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2460: 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20  )../*.** A open 
2470: 70 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e  page cache is an
2480: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2490: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
24a0: 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  ture..**.** Page
24b0: 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65  r.errCode may be
24c0: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49   set to SQLITE_I
24d0: 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52  OERR, SQLITE_COR
24e0: 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72 20 53  RUPT, or.** or S
24f0: 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65  QLITE_FULL. Once
2500: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69 72 73   one of the firs
2510: 74 20 74 68 72 65 65 20 65 72 72 6f 72 73 20 6f  t three errors o
2520: 63 63 75 72 73 2c 20 69 74 20 70 65 72 73 69 73  ccurs, it persis
2530: 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 74  ts.** and is ret
2540: 75 72 6e 65 64 20 61 73 20 74 68 65 20 72 65 73  urned as the res
2550: 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a  ult of every maj
2560: 6f 72 20 70 61 67 65 72 20 41 50 49 20 63 61 6c  or pager API cal
2570: 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c 49 54  l.  The.** SQLIT
2580: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
2590: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
25a0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
25b0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
25c0: 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73 75 63   the.** next suc
25d0: 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63 6b  cessful rollback
25e0: 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f 6e   is performed on
25f0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
2600: 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54  . Also,.** SQLIT
2610: 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f 74 20  E_FULL does not 
2620: 61 66 66 65 63 74 20 74 68 65 20 73 71 6c 69 74  affect the sqlit
2630: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
2640: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
2650: 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c 20 74  kup().** APIs, t
2660: 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65  hey may still be
2670: 20 75 73 65 64 20 73 75 63 63 65 73 73 66 75 6c   used successful
2680: 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 61  ly..*/.struct Pa
2690: 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75 72 6e  ger {.  u8 journ
26a0: 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  alOpen;         
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a      /* True if j
26c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
26d0: 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69 64  riptors is valid
26e0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
26f0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2710: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2720: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2730: 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20 20   useJournal;    
2740: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
2750: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
2760: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
2770: 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64 6c   */.  u8 noReadl
2780: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
2790: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
27a0: 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65 61  er to obtain rea
27b0: 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 73  dlocks */.  u8 s
27c0: 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  tmtOpen;        
27d0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27e0: 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
27f0: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f   subjournal is o
2800: 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  pen */.  u8 stmt
2810: 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20 20  InUse;          
2820: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65 20       /* True we 
2830: 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d 65  are in a stateme
2840: 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f  nt subtransactio
2850: 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41 75  n */.  u8 stmtAu
2860: 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20 20  toopen;         
2870: 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20     /* Open stmt 
2880: 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69  journal when mai
2890: 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  n journal is ope
28a0: 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e  ned*/.  u8 noSyn
28b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
28c0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79      /* Do not sy
28d0: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  nc the journal i
28e0: 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66  f true */.  u8 f
28f0: 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20  ullSync;        
2900: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78          /* Do ex
2910: 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65  tra syncs of the
2920: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62   journal for rob
2930: 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20  ustness */.  u8 
2940: 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20 20 20  full_fsync;     
2950: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20           /* Use 
2960: 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68 65 6e  F_FULLFSYNC when
2970: 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20   available */.  
2980: 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20  u8 state;       
2990: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48  AGER_UNLOCK, _SH
29b0: 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c  ARED, _RESERVED,
29c0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 74 65   etc. */.  u8 te
29d0: 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20  mpFile;         
29e0: 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e         /* zFilen
29f0: 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72 61  ame is a tempora
2a00: 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  ry file */.  u8 
2a10: 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20  readOnly;       
2a20: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2a30: 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79   for a read-only
2a40: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75   database */.  u
2a50: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
2a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2a70: 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29  ue if an fsync()
2a80: 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68   is needed on th
2a90: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2aa0: 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20 20  8 dirtyCache;   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2ac0: 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61 67  ue if cached pag
2ad0: 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 20  es have changed 
2ae0: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2af0: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2b00: 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e 74   /* Disable Dont
2b10: 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61  Rollback() for a
2b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2b30: 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20   memDb;         
2b40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2b50: 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c  e to inhibit all
2b60: 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75   file I/O */.  u
2b70: 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20  8 setMaster;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
2b90: 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65  ue if a m-j name
2ba0: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
2bb0: 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75  n to jrnl */.  u
2bc0: 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20  8 doNotSync;    
2bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2be0: 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74 72 75  olean. While tru
2bf0: 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20  e, do not spill 
2c00: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 75  the cache */.  u
2c10: 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b  8 exclusiveMode;
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 6f             /* Bo
2c30: 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66 20 6c  olean. True if l
2c40: 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43  ocking_mode==EXC
2c50: 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38 20 63  LUSIVE */.  u8 c
2c60: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
2c80: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
2c90: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
2ca0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 65 72  nter */.  int er
2cb0: 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  rCode;          
2cc0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
2cd0: 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66  several kinds of
2ce0: 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74   errors */.  int
2cf0: 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20   dbSize;        
2d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d10: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
2d20: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  he file */.  int
2d30: 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20   origDbSize;    
2d40: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
2d50: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
2d60: 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a  rrent change */.
2d70: 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20    int stmtSize; 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d90: 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73   Size of databas
2da0: 65 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20  e (in pages) at 
2db0: 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a  stmt_begin() */.
2dc0: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2de0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
2df0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2e00: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
2e10: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
2e20: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
2e30: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
2e40: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
2e50: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20  ecksum */.  int 
2e60: 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20  stmtNRec;       
2e70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e80: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
2e90: 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  stmt subjournal 
2ea0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b  */.  int nExtra;
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e   /* Add this man
2ed0: 79 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20  y bytes to each 
2ee0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
2ef0: 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65  /.  int pageSize
2f00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2f10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
2f20: 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es in a page */.
2f30: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f50: 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2f60: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
2f70: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69    /* Number of i
2fa0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77  n-memory pages w
2fb0: 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30  ith PgHdr.nRef>0
2fc0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65   */.  int mxPage
2fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe0: 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2ff0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
3000: 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f  hold in cache */
3010: 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20  .  Pgno mxPgno; 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3030: 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  * Maximum allowe
3040: 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  d size of the da
3050: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 2a  tabase */.  u8 *
3060: 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  aInJournal;     
3070: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
3080: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
3090: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
30a0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61   file */.  u8 *a
30b0: 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20  InStmt;         
30c0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
30d0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
30e0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
30f0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
3100: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3110: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3120: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3130: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
3140: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
3150: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
3160: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
3170: 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79  char *zDirectory
3180: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3190: 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61  irectory hold da
31a0: 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e  tabase and journ
31b0: 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73  al files */.  Os
31c0: 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20  File *fd, *jfd; 
31d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
31e0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
31f0: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
3200: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69  ournal */.  OsFi
3210: 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20  le *stfd;       
3220: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
3230: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
3240: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
3250: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79  journal*/.  Busy
3260: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
3270: 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74  ndler;  /* Point
3280: 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73  er to sqlite.bus
3290: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67  yHandler */.  Pg
32a0: 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c  Hdr *pFirst, *pL
32b0: 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73  ast;      /* Lis
32c0: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
32d0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72  */.  PgHdr *pFir
32e0: 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20  stSynced;       
32f0: 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20 70   /* First free p
3300: 61 67 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e  age with PgHdr.n
3310: 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20  eedSync==0 */.  
3320: 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20  PgHdr *pAll;    
3330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3340: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
3350: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74   */.  PgHdr *pSt
3360: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
3370: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
3380: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
3390: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
33a0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74  /.  PgHdr *pDirt
33b0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
33c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64  /* List of all d
33d0: 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20  irty pages */.  
33e0: 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20  i64 journalOff; 
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
3400: 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73  urrent byte offs
3410: 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  et in the journa
3420: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
3430: 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20  journalHdr;     
3440: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20          /* Byte 
3450: 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f  offset to previo
3460: 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  us journal heade
3470: 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48  r */.  i64 stmtH
3480: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
3490: 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72     /* First jour
34a0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
34b0: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
34c0: 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43  t */.  i64 stmtC
34d0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
34e0: 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20     /* cksumInit 
34f0: 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77  when statement w
3500: 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  as started */.  
3510: 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  i64 stmtJSize;  
3520: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
3530: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
3540: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
3550: 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69  /.  int sectorSi
3560: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3570: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
3580: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
3590: 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66  llback */.#ifdef
35a0: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
35b0: 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20  nt nHit, nMiss; 
35c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61             /* Ca
35d0: 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d 69 73  che hits and mis
35e0: 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  sing */.  int nR
35f0: 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20 20 20  ead, nWrite;    
3600: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
3610: 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69  e pages read/wri
3620: 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  tten */.#endif. 
3630: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
3640: 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74  tor)(DbPage*,int
3650: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
3660: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65  routine when fre
3670: 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20  eing pages */.  
3680: 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72  void (*xReiniter
3690: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
36a0: 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72    /* Call this r
36b0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f  outine when relo
36c0: 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23  ading pages */.#
36d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
36e0: 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a 28  _CODEC.  void *(
36f0: 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76  *xCodec)(void*,v
3700: 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20  oid*,Pgno,int); 
3710: 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65  /* Routine for e
3720: 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20  n/decoding data 
3730: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  */.  void *pCode
3740: 63 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  cArg;           
3750: 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
3760: 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a  nt to xCodec() *
3770: 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e  /.#endif.  int n
3780: 48 61 73 68 3b 20 20 20 20 20 20 20 20 20 20 20  Hash;           
3790: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
37a0: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
37b0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64   table */.  PgHd
37c0: 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20 20 20  r **aHash;      
37d0: 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20          /* Hash 
37e0: 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67  table to map pag
37f0: 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64  e number to PgHd
3800: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
3810: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
3820: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61  _MANAGEMENT.  Pa
3830: 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ger *pNext;     
3840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 6e            /* Lin
3850: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
3860: 72 73 20 69 6e 20 74 68 69 73 20 74 68 72 65 61  rs in this threa
3870: 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68  d */.#endif.  ch
3880: 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20  ar *pTmpSpace;  
3890: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
38a0: 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65  er.pageSize byte
38b0: 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74  s of space for t
38c0: 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72  mp use */.  char
38d0: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
38e0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
38f0: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
3900: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
3910: 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  s */.};../*.** T
3920: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
3930: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f  bal variables ho
3940: 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64  ld counters used
3950: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
3960: 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20  purposes only.  
3970: 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  These variables 
3980: 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a  do not exist in.
3990: 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67  ** a non-testing
39a0: 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76   build.  These v
39b0: 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74  ariables are not
39c0: 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f   thread-safe..*/
39d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
39e0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
39f0: 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
3a00: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
3a10: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
3a20: 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20  es read from DB 
3a30: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3a40: 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
3a50: 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d  nt = 0;   /* Num
3a60: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
3a70: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20  s written to DB 
3a80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3a90: 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
3aa0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
3ab0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
3ac0: 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20  tten to journal 
3ad0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  */.int sqlite3_p
3ae0: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
3af0: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
3b00: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
3b10: 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65  es freed */.# de
3b20: 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28  fine PAGER_INCR(
3b30: 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20  v)  v++.#else.# 
3b40: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
3b50: 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f  R(v).#endif..../
3b60: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
3b70: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
3b80: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
3b90: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
3ba0: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
3bb0: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
3bc0: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
3bd0: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
3be0: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
3bf0: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
3c00: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
3c10: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
3c20: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
3c30: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
3c40: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
3c50: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
3c60: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
3c70: 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72  l is begin.** wr
3c80: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
3c90: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
3ca0: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
3cb0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
3cc0: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
3cd0: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
3ce0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
3cf0: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
3d00: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
3d10: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
3d20: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
3d30: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
3d40: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
3d50: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
3d60: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
3d70: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
3d80: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
3d90: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
3da0: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
3db0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3dc0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
3dd0: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
3de0: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
3df0: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
3e00: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
3e10: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
3e20: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
3e30: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
3e40: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
3e50: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
3e60: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
3e70: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
3e80: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
3e90: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
3ea0: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
3eb0: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
3ec0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
3ed0: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
3ee0: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
3ef0: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
3f00: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
3f10: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
3f20: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
3f30: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
3f40: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
3f50: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
3f60: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
3f70: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
3f80: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
3f90: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
3fa0: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
3fb0: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
3fc0: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
3fd0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
3fe0: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
3ff0: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
4000: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
4010: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
4020: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
4030: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
4040: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
4050: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
4060: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
4070: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
4080: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4090: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
40a0: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
40b0: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
40c0: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
40d0: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
40e0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
40f0: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
4100: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
4110: 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69  urnal is determi
4120: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f  ned.** by the fo
4130: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a  llowing macros..
4140: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
4150: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
4160: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
4170: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
4180: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
4190: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
41a0: 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65  is pager. In the
41b0: 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f   future, this co
41c0: 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f  uld be.** set to
41d0: 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64   some value read
41e0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63   from the disk c
41f0: 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69  ontroller. The i
4200: 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72  mportant.** char
4210: 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68  acteristic is th
4220: 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d  at it is the sam
4230: 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b  e size as a disk
4240: 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66   sector..*/.#def
4250: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
4260: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
4270: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
4280: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
4290: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
42a0: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
42b0: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
42c0: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
42d0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
42e0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
42f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
4300: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
4310: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
4320: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
4330: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
4340: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
4350: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
4360: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
4370: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
4380: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
4390: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
43a0: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
43b0: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
43c0: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
43d0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
43e0: 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62  ./*.** Page numb
43f0: 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  er PAGER_MJ_PGNO
4400: 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69   is never used i
4410: 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
4420: 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72  base (it is.** r
4430: 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b  eserved for work
4440: 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e  ing around a win
4450: 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d  dows/posix incom
4460: 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20  patibility). It 
4470: 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68  is.** used in th
4480: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67  e journal to sig
4490: 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65  nify that the re
44a0: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a  mainder of the j
44b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
44c0: 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74  is devoted to st
44d0: 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a  oring a master j
44e0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68  ournal name - th
44f0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
4500: 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c  pages to.** roll
4510: 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65   back. See comme
4520: 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e  nts for function
4530: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
4540: 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c  nal() for detail
4550: 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65  s..*/./* #define
4560: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4570: 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ) (PENDING_BYTE/
4580: 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29  ((x)->pageSize))
4590: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45   */.#define PAGE
45a0: 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50  R_MJ_PGNO(x) ((P
45b0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29  ENDING_BYTE/((x)
45c0: 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a  ->pageSize))+1).
45d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
45e0: 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75  um legal page nu
45f0: 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20  mber is (2^31 - 
4600: 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  1)..*/.#define P
4610: 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31  AGER_MAX_PGNO 21
4620: 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20  47483647../*.** 
4630: 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65  Enable reference
4640: 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20   count tracking 
4650: 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20  (for debugging) 
4660: 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20  here:.*/.#ifdef 
4670: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
4680: 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66  nt pager3_refinf
4690: 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20  o_enable = 0;.  
46a0: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
46b0: 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20  r_refinfo(PgHdr 
46c0: 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  *p){.    static 
46d0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20  int cnt = 0;.   
46e0: 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65 66   if( !pager3_ref
46f0: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65  info_enable ) re
4700: 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  turn;.    sqlite
4710: 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20  3DebugPrintf(.  
4720: 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34       "REFCNT: %4
4730: 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
4740: 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c  -3d total=%d\n",
4750: 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c  .       p->pgno,
4760: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
4770: 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70  ), p->nRef, p->p
4780: 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20  Pager->nRef.    
4790: 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20  );.    cnt++;   
47a0: 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20  /* Something to 
47b0: 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
47c0: 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66   on */.  }.# def
47d0: 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20  ine REFINFO(X)  
47e0: 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29  pager_refinfo(X)
47f0: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
4800: 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69  REFINFO(X).#endi
4810: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
4820: 74 72 75 65 20 69 66 20 70 61 67 65 20 2a 70 50  true if page *pP
4830: 67 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  g has already be
4840: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
4850: 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a  e statement.** j
4860: 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61 74 65  ournal (or state
4870: 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20 68 61  ment snapshot ha
4880: 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  s been created, 
4890: 69 66 20 2a 70 50 67 20 69 73 20 70 61 72 74 0a  if *pPg is part.
48a0: 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ** of an in-memo
48b0: 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a 2a 2f  ry database)..*/
48c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
48d0: 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67 48 64  InStatement(PgHd
48e0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
48f0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4900: 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 4d 45  pPager;.  if( ME
4910: 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74 75 72  MDB ){.    retur
4920: 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  n PGHDR_TO_HIST(
4930: 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e 69 6e  pPg, pPager)->in
4940: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
4950: 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70     Pgno pgno = p
4960: 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 75 38  Pg->pgno;.    u8
4970: 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e 61 49   *a = pPager->aI
4980: 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74 75 72  nStmt;.    retur
4990: 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70 67 6e  n (a && (int)pgn
49a0: 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
49b0: 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f 2f 38  ize && (a[pgno/8
49c0: 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
49d0: 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  )));.  }.}../*.*
49e0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
49f0: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
4a00: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
4a10: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
4a20: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
4a30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
4a40: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
4a50: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
4a60: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
4a70: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
4a80: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
4a90: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
4aa0: 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71   );.  aHash = sq
4ab0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4ac0: 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20 29  of(aHash[0])*N )
4ad0: 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30  ;.  if( aHash==0
4ae0: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75   ){.    /* Failu
4af0: 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20  re to rehash is 
4b00: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49  not an error.  I
4b10: 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66  t is only a perf
4b20: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a  ormance hit. */.
4b30: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
4b40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
4b50: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
4b60: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e  Pager->nHash = N
4b70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
4b80: 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f 72  h = aHash;.  for
4b90: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
4ba0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
4bb0: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
4bc0: 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20 70  int h;.    if( p
4bd0: 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20  Pg->pgno==0 ){. 
4be0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
4bf0: 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26  ->pNextHash==0 &
4c00: 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  & pPg->pPrevHash
4c10: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f 6e  ==0 );.      con
4c20: 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tinue;.    }.   
4c30: 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26   h = pPg->pgno &
4c40: 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67 2d   (N-1);.    pPg-
4c50: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48 61  >pNextHash = aHa
4c60: 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20 61  sh[h];.    if( a
4c70: 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 20  Hash[h] ){.     
4c80: 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76   aHash[h]->pPrev
4c90: 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
4ca0: 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20 3d  }.    aHash[h] =
4cb0: 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e 70   pPg;.    pPg->p
4cc0: 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20 20  PrevHash = 0;.  
4cd0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  }.}../*.** Read 
4ce0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4cf0: 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20   from the given 
4d00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
4d10: 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65    Store the inte
4d20: 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72  ger.** that is r
4d30: 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52  ead in *pRes.  R
4d40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
4d50: 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f  if everything wo
4d60: 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65  rked, or an.** e
4d70: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4d80: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4d90: 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c  g..**.** All val
4da0: 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f  ues are stored o
4db0: 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e  n disk as big-en
4dc0: 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dian..*/.static 
4dd0: 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 4f  int read32bits(O
4de0: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 2a  sFile *fd, u32 *
4df0: 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  pRes){.  unsigne
4e00: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4e10: 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
4e20: 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20 73  OsRead(fd, ac, s
4e30: 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69 66  izeof(ac));.  if
4e40: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4e50: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
4e60: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
4e70: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
4e80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
4e90: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
4ea0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
4eb0: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
4ec0: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
4ed0: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
4ee0: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
4ef0: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
4f00: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
4f10: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4f20: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4f30: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4f40: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4f50: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4f60: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4f70: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4f80: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4f90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4fa0: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
4fb0: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
4fc0: 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  .  char ac[4];. 
4fd0: 20 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76   put32bits(ac, v
4fe0: 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  al);.  return sq
4ff0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c  lite3OsWrite(fd,
5000: 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   ac, 4);.}../*.*
5010: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
5020: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
5030: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
5040: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
5050: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
5060: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
5070: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
5080: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
5090: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
50a0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
50b0: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
50c0: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
50d0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
50e0: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
50f0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5100: 28 61 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  (ac);.}.../*.** 
5110: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
5120: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
5130: 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63  hen an error occ
5140: 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70  urs within the p
5150: 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68  ager.** code. Th
5160: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
5170: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
5180: 20 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63   the pager struc
5190: 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63  ture, the.** sec
51a0: 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f  ond the error-co
51b0: 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72  de about to be r
51c0: 65 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67  eturned by a pag
51d0: 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e  er API function.
51e0: 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72   .** The value r
51f0: 65 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70  eturned is a cop
5200: 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20  y of the second 
5210: 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73  argument to this
5220: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a   function. .**.*
5230: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
5240: 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49  argument is SQLI
5250: 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45  TE_IOERR, SQLITE
5260: 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c  _CORRUPT, or SQL
5270: 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20  ITE_FULL.** the 
5280: 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65  error becomes pe
5290: 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75  rsistent. All su
52a0: 62 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c  bsequent API cal
52b0: 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72  ls on this Pager
52c0: 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61  .** will immedia
52d0: 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20  tely return the 
52e0: 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  same error code.
52f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
5300: 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72  ager_error(Pager
5310: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63   *pPager, int rc
5320: 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72  ){.  int rc2 = r
5330: 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65  c & 0xff;.  asse
5340: 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
5350: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode==SQLITE_FULL
5360: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43   || pPager->errC
5370: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  ode==SQLITE_OK )
5380: 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d  ;.  if(.    rc2=
5390: 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a  =SQLITE_FULL ||.
53a0: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
53b0: 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32  IOERR ||.    rc2
53c0: 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
53d0: 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
53e0: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
53f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
5400: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
5410: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a  E_CHECK_PAGES./*
5420: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d  .** Return a 32-
5430: 62 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20  bit hash of the 
5440: 70 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50  page data for pP
5450: 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  age..*/.static u
5460: 33 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  32 pager_pagehas
5470: 68 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b  h(PgHdr *pPage){
5480: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
5490: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
54a0: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
54b0: 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
54c0: 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  r *)PGHDR_TO_DAT
54d0: 41 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28  A(pPage);.  for(
54e0: 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50  i=0; i<pPage->pP
54f0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
5500: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
5510: 20 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b   (hash+i)^pData[
5520: 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  i];.  }.  return
5530: 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   hash;.}../*.** 
5540: 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d  The CHECK_PAGE m
5550: 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48  acro takes a PgH
5560: 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65  dr* as an argume
5570: 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48  nt. If SQLITE_CH
5580: 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20  ECK_PAGES.** is 
5590: 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45  defined, and NDE
55a0: 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  BUG is not defin
55b0: 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20  ed, an assert() 
55c0: 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73  statement checks
55d0: 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67  .** that the pag
55e0: 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74  e is either dirt
55f0: 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68  y or still match
5600: 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65  es the calculate
5610: 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a  d page-hash..*/.
5620: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5630: 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28  GE(x) checkPage(
5640: 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  x).static void c
5650: 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a  heckPage(PgHdr *
5660: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
5670: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
5680: 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ger;.  assert( !
5690: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c  pPg->pageHash ||
56a0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
56b0: 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67   || MEMDB || pPg
56c0: 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20  ->dirty || .    
56d0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d    pPg->pageHash=
56e0: 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28  =pager_pagehash(
56f0: 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65  pPg) );.}..#else
5700: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
5710: 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  AGE(x).#endif../
5720: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
5730: 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75  s called the jou
5740: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
5750: 67 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20  ger pPager must 
5760: 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20  be open..** The 
5770: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5780: 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64  ile name is read
5790: 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66   from the end of
57a0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a   the file and .*
57b0: 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d  * written into m
57c0: 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
57d0: 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  rom sqliteMalloc
57e0: 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73  (). *pzMaster is
57f0: 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74  .** set to point
5800: 20 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61   at the memory a
5810: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5820: 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
5830: 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65  r must.** sqlite
5840: 46 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72  Free() *pzMaster
5850: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61  ..**.** If no ma
5860: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5870: 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e  e name is presen
5880: 74 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73  t *pzMaster is s
5890: 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53  et to 0 and.** S
58a0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
58b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
58c0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
58d0: 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c  al(OsFile *pJrnl
58e0: 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65  , char **pzMaste
58f0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
5900: 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73  u32 len;.  i64 s
5910: 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b  zJ;.  u32 cksum;
5920: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69  .  int i;.  unsi
5930: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
5940: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
5950: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
5960: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
5970: 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a  *pzMaster = 0;..
5980: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5990: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
59a0: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
59b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
59c0: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
59d0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
59e0: 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73  3OsSeek(pJrnl, s
59f0: 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63  zJ-16);.  if( rc
5a00: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5a10: 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20  turn rc;. .  rc 
5a20: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
5a30: 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  nl, &len);.  if(
5a40: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5a50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
5a60: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
5a70: 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  Jrnl, &cksum);. 
5a80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
5a90: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
5aa0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5ab0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
5ac0: 67 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72  gic, 8);.  if( r
5ad0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
5ae0: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
5af0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
5b00: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5b10: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
5b20: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
5b30: 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  6-len);.  if( rc
5b40: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
5b50: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d  turn rc;..  *pzM
5b60: 61 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29  aster = (char *)
5b70: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e  sqliteMalloc(len
5b80: 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d  +1);.  if( !*pzM
5b90: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74  aster ){.    ret
5ba0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
5bb0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
5bc0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
5bd0: 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  , *pzMaster, len
5be0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5bf0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
5c00: 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74  liteFree(*pzMast
5c10: 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74  er);.    *pzMast
5c20: 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  er = 0;.    retu
5c30: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
5c40: 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63   See if the chec
5c50: 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65  ksum matches the
5c60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5c70: 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  name */.  for(i=
5c80: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
5c90: 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70      cksum -= (*p
5ca0: 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d  zMaster)[i];.  }
5cb0: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
5cc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
5cd0: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
5ce0: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
5cf0: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
5d00: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
5d10: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
5d20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5d30: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
5d40: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
5d50: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
5d60: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
5d70: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
5d80: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
5d90: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
5da0: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
5db0: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
5dc0: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  */.    sqliteFre
5dd0: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5de0: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
5df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a  .  }else{.    (*
5e00: 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d  pzMaster)[len] =
5e10: 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20   '\0';.  }.   . 
5e20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5e30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  K;.}../*.** Seek
5e40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5e50: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5e60: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
5e70: 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61  boundary where a
5e80: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  .** journal head
5e90: 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f  er may be read o
5ea0: 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72  r written. Pager
5eb0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75  .journalOff is u
5ec0: 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  pdated with.** t
5ed0: 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73  he new seek offs
5ee0: 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f  et..**.** i.e fo
5ef0: 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20  r a sector size 
5f00: 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e  of 512:.**.** In
5f10: 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20  put Offset      
5f20: 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f          Output O
5f30: 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d  ffset.** -------
5f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5f60: 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20  .** 0           
5f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a                0.
5f80: 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20  ** 512          
5f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5fa0: 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20  .** 100         
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5fc0: 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20  2.** 2000       
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
5fe0: 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69  048.** .*/.stati
5ff0: 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61  c int seekJourna
6000: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
6010: 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65  er){.  i64 offse
6020: 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d  t = 0;.  i64 c =
6030: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6040: 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a  Off;.  if( c ){.
6050: 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63      offset = ((c
6060: 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  -1)/JOURNAL_HDR_
6070: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20  SZ(pPager) + 1) 
6080: 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  * JOURNAL_HDR_SZ
6090: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
60a0: 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a  assert( offset%J
60b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
60c0: 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73  ager)==0 );.  as
60d0: 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20  sert( offset>=c 
60e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66  );.  assert( (of
60f0: 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f  fset-c)<JOURNAL_
6100: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
6110: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
6120: 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b  nalOff = offset;
6130: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
6140: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
6150: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
6160: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
6170: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6180: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6190: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
61a0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
61b0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
61c0: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
61d0: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
61e0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
61f0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
6200: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
6210: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
6220: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
6230: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
6240: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
6250: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
6260: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
6270: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
6280: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
6290: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
62a0: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
62b0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
62c0: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
62d0: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
62e0: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
62f0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
6300: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
6310: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
6320: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
6330: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
6340: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
6350: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
6360: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
6370: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
6380: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
6390: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
63a0: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
63b0: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
63c0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
63d0: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
63e0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
63f0: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69  lMagic)+16];.  i
6400: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
6410: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
6420: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
6430: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
6440: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6450: 66 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  ff;.  }..  rc = 
6460: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6470: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
6480: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6490: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
64a0: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
64b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
64c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
64d0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
64e0: 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20  (pPager);..  /* 
64f0: 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20  FIX ME: .  **.  
6500: 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20  ** Possibly for 
6510: 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e  a pager not in n
6520: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  o-sync mode, the
6530: 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73   journal magic s
6540: 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62  hould not.  ** b
6550: 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20  e written until 
6560: 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69  nRec is filled i
6570: 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78  n as part of nex
6580: 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e  t syncJournal().
6590: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75   .  **.  ** Actu
65a0: 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77  ally maybe the w
65b0: 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  hole journal hea
65c0: 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65  der should be de
65d0: 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74  layed until that
65e0: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69  .  ** point. Thi
65f0: 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20  nk about this.. 
6600: 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65   */.  memcpy(zHe
6610: 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  ader, aJournalMa
6620: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
6630: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f  rnalMagic));.  /
6640: 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64  * The nRec Field
6650: 2e 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72  . 0xFFFFFFFF for
6660: 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c   no-sync journal
6670: 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  s. */.  put32bit
6680: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
6690: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
66a0: 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ], pPager->noSyn
66b0: 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  c ? 0xffffffff :
66c0: 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61   0);.  /* The ra
66d0: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
66e0: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
66f0: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
6700: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
6710: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
6720: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6730: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
6740: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
6750: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
6760: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
6770: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
6780: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
6790: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
67a0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
67b0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
67c0: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
67d0: 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  dbSize);.  /* Th
67e0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
67f0: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
6800: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
6810: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
6820: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
6830: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
6840: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
6850: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
6860: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
6870: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
6880: 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f  ournalHdr, sizeo
6890: 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72  f(zHeader))).  r
68a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
68b0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
68c0: 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
68d0: 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a  zHeader));..  /*
68e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
68f0: 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69  der has been wri
6900: 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c  tten successfull
6910: 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72  y. Seek the jour
6920: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65  nal.  ** file de
6930: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
6940: 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  end of the journ
6950: 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  al header sector
6960: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
6970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6980: 20 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49    IOTRACE(("JTAI
6990: 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50  L %p %lld\n", pP
69a0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
69b0: 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20  urnalOff-1)).   
69c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
69d0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
69e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
69f0: 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20  Off-1);.    if( 
6a00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
6a10: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6a20: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
6a30: 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20  r->jfd, "\000", 
6a40: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
6a50: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
6a60: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
6a70: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
6a80: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
6a90: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
6aa0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
6ab0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6ac0: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
6ad0: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
6ae0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
6af0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
6b00: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
6b10: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
6b20: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
6b30: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
6b40: 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   of.** the journ
6b50: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
6b60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
6b70: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
6b80: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65  ccessfully, *nRe
6b90: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
6ba0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
6bb0: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
6bc0: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
6bd0: 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73  and *dbSize is s
6be0: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
6bf0: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
6c00: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
6c10: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
6c20: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
6c30: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6c40: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
6c50: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
6c60: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
6c70: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
6c80: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
6c90: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
6ca0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
6cb0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
6cc0: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
6cd0: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
6ce0: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
6cf0: 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64  ed and *nRec and
6d00: 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74   *dbSize are not
6d10: 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41   set.  If JOURNA
6d20: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
6d30: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
6d40: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6d50: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
6d60: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
6d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6d80: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
6d90: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
6da0: 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53   .  i64 journalS
6db0: 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65  ize,.  u32 *pNRe
6dc0: 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69  c, .  u32 *pDbSi
6dd0: 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ze.){.  int rc;.
6de0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6df0: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
6e00: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
6e10: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
6e20: 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a  */..  rc = seekJ
6e30: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
6e40: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6e50: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
6e60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6e70: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
6e80: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
6e90: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
6ea0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
6eb0: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  E;.  }..  rc = s
6ec0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
6ed0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
6ee0: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
6ef0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6f00: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
6f10: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
6f20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
6f30: 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30  zeof(aMagic))!=0
6f40: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
6f50: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a  QLITE_DONE;.  }.
6f60: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6f70: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6f80: 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  pNRec);.  if( rc
6f90: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6fa0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6fb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  (pPager->jfd, &p
6fc0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6fd0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6fe0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6ff0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
7000: 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65  er->jfd, pDbSize
7010: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
7020: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55  turn rc;..  /* U
7030: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
7040: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
7050: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
7060: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
7070: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
7080: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
7090: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
70a0: 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63  urnal was.  ** c
70b0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
70c0: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
70d0: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
70e0: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  is routine.  ** 
70f0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
7100: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
7110: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
7120: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
7130: 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
7140: 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
7150: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
7160: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
7170: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
7180: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7190: 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65  d, (u32 *)&pPage
71a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a  r->sectorSize);.
71b0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
71c0: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
71d0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
71e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
71f0: 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71  ager);.  rc = sq
7200: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
7210: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
7220: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
7230: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
7240: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
7250: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
7260: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
7270: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7280: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
7290: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
72a0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
72b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
72c0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
72d0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
72e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
72f0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
7300: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
7310: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
7320: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
7330: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
7340: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
7350: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
7360: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
7370: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
7380: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
7390: 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79  is:.**.** + 4 by
73a0: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
73b0: 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73  NO..** + N bytes
73c0: 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74  : length of mast
73d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
73e0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  .** + 4 bytes: N
73f0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  .** + 4 bytes: M
7400: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
7410: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
7420: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
7430: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
7440: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
7450: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
7460: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
7470: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
7480: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
7490: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  nal name..**.** 
74a0: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
74b0: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
74c0: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
74d0: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
74e0: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
74f0: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
7500: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
7510: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
7520: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
7530: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
7540: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
7550: 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20  c;.  int len; . 
7560: 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63   int i; .  u32 c
7570: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
7580: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
7590: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
75a0: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
75b0: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
75c0: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
75d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
75e0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
75f0: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
7600: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
7610: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
7620: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
7630: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
7640: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
7650: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
7660: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
7670: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
7680: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
7690: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
76a0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
76b0: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
76c0: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
76d0: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
76e0: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
76f0: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
7700: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
7710: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
7720: 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  .    rc = seekJo
7730: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
7740: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
7750: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
7760: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65   rc;.  }.  pPage
7770: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
7780: 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63   (len+20);..  rc
7790: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
77a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45  Pager->jfd, PAGE
77b0: 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
77c0: 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ));.  if( rc!=SQ
77d0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
77e0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
77f0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
7800: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
7810: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
7820: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
7830: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33  turn rc;..  put3
7840: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
7850: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
7860: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
7870: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
7880: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
7890: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
78a0: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
78b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
78c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
78d0: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
78e0: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70  rnalMagic));.  p
78f0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
7900: 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
7910: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  c;.  return rc;.
7920: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20  }../*.** Add or 
7930: 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72  remove a page fr
7940: 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  om the list of a
7950: 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ll pages that ar
7960: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74  e in the.** stat
7970: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
7980: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b  *.** The Pager k
7990: 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20  eeps a separate 
79a0: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68  list of pages th
79b0: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
79c0: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   in.** the state
79d0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
79e0: 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71  his helps the sq
79f0: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
7a00: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
7a10: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
7a20: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
7a30: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
7a40: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
7a50: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
7a60: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
7a70: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
7a80: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
7a90: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61  atic void page_a
7aa0: 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
7ab0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
7ac0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
7ad0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67  Pg->pPager;.  Pg
7ae0: 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
7af0: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
7b00: 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 61  Pg, pPager);.  a
7b10: 73 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a  ssert( MEMDB );.
7b20: 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69 6e    if( !pHist->in
7b30: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
7b40: 72 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65 76  rt( pHist->pPrev
7b50: 53 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73 74  Stmt==0 && pHist
7b60: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29  ->pNextStmt==0 )
7b70: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
7b80: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
7b90: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
7ba0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50  Pager->pStmt, pP
7bb0: 61 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d 74  ager)->pPrevStmt
7bc0: 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
7bd0: 20 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74    pHist->pNextSt
7be0: 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74  mt = pPager->pSt
7bf0: 6d 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  mt;.    pPager->
7c00: 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  pStmt = pPg;.   
7c10: 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
7c20: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
7c30: 20 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   Find a page in 
7c40: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67  the hash table g
7c50: 69 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75  iven its page nu
7c60: 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  mber.  Return.**
7c70: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
7c80: 65 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69  e page or NULL i
7c90: 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
7ca0: 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
7cb0: 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
7cc0: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
7cd0: 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
7ce0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7cf0: 61 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72  aHash==0 ) retur
7d00: 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65  n 0;.  p = pPage
7d10: 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20  r->aHash[pgno & 
7d20: 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
7d30: 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26  )];.  while( p &
7d40: 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20  & p->pgno!=pgno 
7d50: 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e  ){.    p = p->pN
7d60: 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72  extHash;.  }.  r
7d70: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
7d80: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
7d90: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
7da0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7db0: 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  _unlock(Pager *p
7dc0: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
7dd0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
7de0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20  Mode ){.    if( 
7df0: 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
7e00: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7e10: 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
7e20: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67  OCK);.      pPag
7e30: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
7e40: 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
7e50: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
7e60: 50 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20  Pager)).    }.  
7e70: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7e80: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
7e90: 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e      pPager->chan
7ea0: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b  geCountDone = 0;
7eb0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
7ec0: 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b  ecute a rollback
7ed0: 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
7ee0: 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20  n is active and 
7ef0: 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64  unlock the .** d
7f00: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
7f10: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
7f20: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
7f30: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a  lready entered.*
7f40: 2a 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74  * the error-stat
7f50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
7f60: 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64  d pagerUnlockAnd
7f70: 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
7f80: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72  p){.  if( p->err
7f90: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
7fa0: 20 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74   assert( p->stat
7fb0: 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
7fc0: 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f  D || p->journalO
7fd0: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  pen==0 );.  if( 
7fe0: 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  p->state>=PAGER_
7ff0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
8000: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
8010: 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70  back(p);.  }.  p
8020: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a  ager_unlock(p);.
8030: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
8040: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72  Code || !p->jour
8050: 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65  nalOpen || (p->e
8060: 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70  xclusiveMode&&!p
8070: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b  ->journalOff) );
8080: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72  .  assert( p->er
8090: 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d  rCode || !p->stm
80a0: 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c  tOpen || p->excl
80b0: 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a  usiveMode );.}..
80c0: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
80d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
80e0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
80f0: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
8100: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
8110: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
8120: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
8130: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
8140: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
8150: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
8160: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
8170: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
8180: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
8190: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
81a0: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
81b0: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
81c0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
81d0: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
81e0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
81f0: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  g, *pNext;.  if(
8200: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
8210: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
8220: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
8230: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
8240: 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  t){.    IOTRACE(
8250: 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
8260: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
8270: 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45  pgno));.    PAGE
8280: 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
8290: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
82a0: 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t);.    pNext = 
82b0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
82c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
82d0: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
82e0: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->pStmt = 0;.  p
82f0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
8300: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
8310: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
8320: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
8330: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41   0;.  pPager->pA
8340: 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ll = 0;.  pPager
8350: 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73  ->nHash = 0;.  s
8360: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
8370: 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67  ->aHash);.  pPag
8380: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
8390: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d   pPager->aHash =
83a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
83b0: 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ef = 0;.}../*.**
83c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
83d0: 64 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ds a transaction
83e0: 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  .  A transaction
83f0: 20 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74   is ended by eit
8400: 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20  her.** a COMMIT 
8410: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a  or a ROLLBACK..*
8420: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
8430: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
8440: 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  , the pager has 
8450: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8460: 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52   open and.** a R
8470: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
8480: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
8490: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
84a0: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
84b0: 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74  lease.** the dat
84c0: 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61  abase lock and a
84d0: 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44  cquires a SHARED
84e0: 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61   lock in its pla
84f0: 63 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a  ce if that is.**
8500: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
8510: 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52   thing to do.  R
8520: 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75  elease locks usu
8530: 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69  ally is appropri
8540: 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77  ate,.** unless w
8550: 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69  e are in exclusi
8560: 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f  ve access mode o
8570: 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73  r unless this is
8580: 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e   a .** COMMIT AN
8590: 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42  D BEGIN or ROLLB
85a0: 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70  ACK AND BEGIN op
85b0: 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  eration..**.** T
85c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
85d0: 69 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65  is either delete
85e0: 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a  d or truncated..
85f0: 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73  **.** TODO: Cons
8600: 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65  ider keeping the
8610: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
8620: 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  en for temporary
8630: 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54   databases..** T
8640: 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61  his might give a
8650: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70   performance imp
8660: 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64  rovement on wind
8670: 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e  ows where openin
8680: 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61  g.** a file is a
8690: 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72  n expensive oper
86a0: 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
86b0: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
86c0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
86d0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
86e0: 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
86f0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8700: 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
8710: 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
8720: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
8730: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
8740: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
8750: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8760: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
8770: 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
8780: 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  it(pPager);.  if
8790: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  ( pPager->stmtOp
87a0: 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65  en && !pPager->e
87b0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
87c0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
87d0: 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
87e0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  );.    pPager->s
87f0: 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d  tmtOpen = 0;.  }
8800: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
8810: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
8820: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78    if( pPager->ex
8830: 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20  clusiveMode .   
8840: 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20         && (rc = 
8850: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
8860: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  e(pPager->jfd, 0
8870: 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  ))==SQLITE_OK ){
8880: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
8890: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
88a0: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  d, 0);.      pPa
88b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
88c0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
88d0: 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
88e0: 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
88f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
8900: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
8910: 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67  jfd);.      pPag
8920: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8930: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72  = 0;.      if( r
8940: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
8950: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
8960: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
8970: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
8980: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8990: 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
89a0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
89b0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
89c0: 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
89d0: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
89e0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
89f0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
8a00: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
8a10: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
8a20: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
8a30: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
8a40: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
8a50: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
8a60: 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65  lback = 0;.#ifde
8a70: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
8a80: 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
8a90: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
8aa0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
8ab0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
8ac0: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
8ad0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
8ae0: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
8af0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
8b00: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
8b10: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8b20: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
8b30: 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
8b40: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
8b50: 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
8b60: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->useJournal==0 
8b70: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  );.  }..  if( !p
8b80: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
8b90: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20  Mode ){.    rc2 
8ba0: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
8bb0: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  k(pPager->fd, SH
8bc0: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
8bd0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
8be0: 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
8bf0: 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
8c00: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
8c10: 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61  YNCED ){.    pPa
8c20: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
8c30: 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20  ER_EXCLUSIVE;.  
8c40: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  }.  pPager->orig
8c50: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50  DbSize = 0;.  pP
8c60: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
8c70: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
8c80: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
8c90: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
8ca0: 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
8cb0: 69 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e  irst;.  pPager->
8cc0: 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
8cd0: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
8ce0: 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d  TE_OK?rc2:rc);.}
8cf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
8d00: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65  and return a che
8d10: 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61  cksum for the pa
8d20: 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a  ge of data..**.*
8d30: 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20  * This is not a 
8d40: 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20  real checksum.  
8d50: 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  It is really jus
8d60: 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  t the sum of the
8d70: 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74   .** random init
8d80: 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68  ial value and th
8d90: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  e page number.  
8da0: 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20  We experimented 
8db0: 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73  with.** a checks
8dc0: 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65  um of the entire
8dd0: 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20   data, but that 
8de0: 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20  was found to be 
8df0: 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20  too slow..**.** 
8e00: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61  Note that the pa
8e10: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f  ge number is sto
8e20: 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e  red at the begin
8e30: 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64  ning of data and
8e40: 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d  .** the checksum
8e50: 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68   is stored at th
8e60: 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20  e end.  This is 
8e70: 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a  important.  If j
8e80: 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70  ournal.** corrup
8e90: 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20  tion occurs due 
8ea0: 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  to a power failu
8eb0: 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b  re, the most lik
8ec0: 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20  ely scenario.** 
8ed0: 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20  is that one end 
8ee0: 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20  or the other of 
8ef0: 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  the record will 
8f00: 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20  be changed.  It 
8f10: 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20  is.** much less 
8f20: 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20  likely that the 
8f30: 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20  two ends of the 
8f40: 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77  journal record w
8f50: 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63  ill be.** correc
8f60: 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65  t and the middle
8f70: 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68   be corrupt.  Th
8f80: 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73  us, this "checks
8f90: 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74  um" scheme,.** t
8fa0: 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73  hough fast and s
8fb0: 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74  imple, catches t
8fc0: 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79  he mostly likely
8fd0: 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74   kind of corrupt
8fe0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d  ion..**.** FIX M
8ff0: 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64  E:  Consider add
9000: 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20  ing every 200th 
9010: 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20  (or so) byte of 
9020: 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a  the data to the.
9030: 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68  ** checksum.  Th
9040: 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67  at way if a sing
9050: 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20  le page spans 3 
9060: 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63  or more disk sec
9070: 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79  tors and.** only
9080: 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74   the middle sect
9090: 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77  or is corrupt, w
90a0: 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76  e will still hav
90b0: 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a  e a reasonable.*
90c0: 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c  * chance of fail
90d0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
90e0: 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74   and thus detect
90f0: 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e  ing the problem.
9100: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70  .*/.static u32 p
9110: 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72  ager_cksum(Pager
9120: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
9130: 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33  u8 *aData){.  u3
9140: 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  2 cksum = pPager
9150: 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
9160: 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70  nt i = pPager->p
9170: 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77  ageSize-200;.  w
9180: 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20  hile( i>0 ){.   
9190: 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b   cksum += aData[
91a0: 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30  i];.    i -= 200
91b0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63  ;.  }.  return c
91c0: 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ksum;.}../* Forw
91d0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
91e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
91f0: 61 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29  akeClean(PgHdr*)
9200: 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  ;../*.** Read a 
9210: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
9220: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9230: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
9240: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
9250: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
9260: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
9270: 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d  ** If useCksum==
9280: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
9290: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
92a0: 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20   use checksums. 
92b0: 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72   Checksums.** ar
92c0: 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74  e not used in st
92d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
92e0: 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65   because stateme
92f0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e  nt journals do n
9300: 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75  ot.** need to su
9310: 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c  rvive power fail
9320: 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ures..*/.static 
9330: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
9340: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65  ck_one_page(Page
9350: 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c  r *pPager, OsFil
9360: 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43  e *jfd, int useC
9370: 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ksum){.  int rc;
9380: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
9390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
93a0: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
93b0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
93c0: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
93d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
93e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
93f0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
9400: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
9410: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
9420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9430: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
9440: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
9450: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
9460: 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67  ata = (u8 *)pPag
9470: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20  er->pTmpSpace;  
9480: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
9490: 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a   for a page */..
94a0: 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68    /* useCksum sh
94b0: 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72  ould be true for
94c0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
94d0: 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a  l and false for.
94e0: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a    ** statement j
94f0: 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79  ournals.  Verify
9500: 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c   that this is al
9510: 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20  ways the case.  
9520: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64  */.  assert( jfd
9530: 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20   == (useCksum ? 
9540: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
9550: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20  ager->stfd) );. 
9560: 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29   assert( aData )
9570: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
9580: 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29  bits(jfd, &pgno)
9590: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
95a0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
95b0: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
95c0: 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61  3OsRead(jfd, aDa
95d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
95e0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
95f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
9600: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
9610: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9620: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
9630: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
9640: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
9650: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
9660: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
9670: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
9680: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
9690: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
96a0: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
96b0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
96c0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
96d0: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
96e0: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
96f0: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
9700: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
9710: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
9720: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
9730: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
9740: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
9750: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
9760: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
9770: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
9780: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
9790: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
97a0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
97b0: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
97c0: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
97d0: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
97e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
97f0: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
9800: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
9810: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
9820: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
9830: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
9840: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
9850: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
9860: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
9870: 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
9880: 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20  =cksum ){.      
9890: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
98a0: 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  NE;.    }.  }.. 
98b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
98c0: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
98d0: 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72  SERVED || pPager
98e0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
98f0: 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f  XCLUSIVE );..  /
9900: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
9910: 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74  s in RESERVED st
9920: 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20  ate, then there 
9930: 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f  must be a copy o
9940: 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65  f this.  ** page
9950: 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61   in the pager ca
9960: 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  che. In this cas
9970: 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68  e just update th
9980: 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20  e pager cache,. 
9990: 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61   ** not the data
99a0: 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70  base file. The p
99b0: 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b  age is left mark
99c0: 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73  ed dirty in this
99d0: 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   case..  **.  **
99e0: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
99f0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
9a00: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
9a10: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
9a20: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
9a30: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
9a40: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
9a50: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
9a60: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
9a70: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
9a80: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
9a90: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
9aa0: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
9ab0: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
9ac0: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
9ad0: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
9ae0: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
9af0: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
9b00: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
9b10: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
9b20: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
9b30: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
9b40: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
9b50: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
9b60: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
9b70: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
9b80: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
9b90: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
9ba0: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
9bb0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
9bc0: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
9bd0: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
9be0: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
9bf0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
9c00: 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 72  re in the main r
9c10: 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75  ollback.  ** jou
9c20: 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73 65  rnal.  Otherwise
9c30: 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c 4c  , if a full ROLL
9c40: 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74 65  BACK occurs afte
9c50: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  r the statement.
9c60: 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74 68    ** rollback th
9c70: 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  e full ROLLBACK 
9c80: 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72 65  will not restore
9c90: 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74 73   the page to its
9ca0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 63   original.  ** c
9cb0: 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f 6e  ontent.  Two con
9cc0: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20  ditions must be 
9cd0: 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74 69  met before writi
9ce0: 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
9cf0: 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20 28  se.  ** files. (
9d00: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
9d10: 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e 20  must be locked. 
9d20: 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61   (2) we know tha
9d30: 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20  t the original. 
9d40: 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e 74   ** page content
9d50: 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20   is in the main 
9d60: 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20 62  journal either b
9d70: 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
9d80: 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20 63  is not in.  ** c
9d90: 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74 20  ache or else it 
9da0: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
9db0: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20  dSync==0..  */. 
9dc0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
9dd0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
9de0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
9df0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
9e00: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
9e10: 50 67 21 3d 30 20 29 3b 0a 20 20 50 41 47 45 52  Pg!=0 );.  PAGER
9e20: 54 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b  TRACE3("PLAYBACK
9e30: 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
9e40: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
9e50: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
9e60: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
9e70: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
9e80: 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
9e90: 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a  needSync==0) ){.
9ea0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9eb0: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
9ec0: 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
9ed0: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
9ee0: 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
9ef0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9f00: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
9f10: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
9f20: 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  d, aData, pPager
9f30: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9f40: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20 29   }.    if( pPg )
9f50: 7b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  {.      makeClea
9f60: 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  n(pPg);.    }.  
9f70: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
9f80: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
9f90: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
9fa0: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
9fb0: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
9fc0: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
9fd0: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
9fe0: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
9ff0: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
a000: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
a010: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
a020: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
a030: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
a040: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
a050: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
a060: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
a070: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
a080: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
a090: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
a0a0: 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  ** sqlite3PagerR
a0b0: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
a0c0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
a0d0: 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74  a;.    /* assert
a0e0: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
a0f0: 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  | pPg->pgno==1 )
a100: 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d  ; */.    pData =
a110: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
a120: 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Pg);.    memcpy(
a130: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
a140: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a150: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
a160: 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
a170: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
a180: 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65  niter(pPg, pPage
a190: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
a1a0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
a1b0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
a1c0: 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20    pPg->pageHash 
a1d0: 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  = pager_pagehash
a1e0: 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20  (pPg);.#endif.  
a1f0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
a200: 20 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65   page 1, then re
a210: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
a220: 6f 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56  of Pager.dbFileV
a230: 65 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74  ers..    ** Do t
a240: 68 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64  his before any d
a250: 65 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  ecoding. */.    
a260: 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20  if( pgno==1 ){. 
a270: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
a280: 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
a290: 20 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32   &((u8*)pData)[2
a2a0: 34 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72  4],sizeof(pPager
a2b0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
a2c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
a2d0: 63 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75  code the page ju
a2e0: 73 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73  st read from dis
a2f0: 6b 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28  k */.    CODEC1(
a300: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
a310: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
a320: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
a330: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
a340: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
a350: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
a360: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
a370: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
a380: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
a390: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
a3a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a3b0: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
a3c0: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
a3d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
a3e0: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
a3f0: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
a400: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a410: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
a420: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
a430: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
a440: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a450: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
a460: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
a470: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
a480: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
a490: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
a4a0: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
a4b0: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
a4c0: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
a4d0: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
a4e0: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
a4f0: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
a500: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
a510: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
a520: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
a530: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
a540: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
a550: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
a560: 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68  lmaster(const ch
a570: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
a580: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
a590: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
a5a0: 20 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20   OsFile *master 
a5b0: 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61  = 0;.  char *zMa
a5c0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
a5d0: 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
a5e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a5f0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
a600: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
a610: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
a620: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a630: 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  e */..  /* Open 
a640: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a650: 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76  al file exclusiv
a660: 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65  ely in case some
a670: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20   other process. 
a680: 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74   ** is running t
a690: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
a6a0: 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61  . Not that it ma
a6b0: 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66  kes too much dif
a6c0: 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20  ference..  */.  
a6d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
a6e0: 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74  enReadOnly(zMast
a6f0: 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20  er, &master);.  
a700: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
a710: 54 45 5f 4f 4b 20 7c 7c 20 6d 61 73 74 65 72 20  TE_OK || master 
a720: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a730: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a740: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
a750: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
a760: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
a770: 46 69 6c 65 53 69 7a 65 28 6d 61 73 74 65 72 2c  FileSize(master,
a780: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
a790: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a7a0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
a7b0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
a7c0: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
a7d0: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
a7e0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
a7f0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
a800: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f   = 0;..    /* Lo
a810: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
a820: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a830: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
a840: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
a850: 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  * sqliteMalloc()
a860: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
a870: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
a880: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
a890: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
a8a0: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
a8b0: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
a8c0: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  nal);.    if( !z
a8d0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
a8e0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
a8f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a900: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
a910: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
a920: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
a930: 28 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  (master, zMaster
a940: 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72  Journal, nMaster
a950: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
a960: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a970: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
a980: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
a990: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
a9a0: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
a9b0: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
a9c0: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
a9d0: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
a9e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
a9f0: 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72  FileExists(zJour
aa00: 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
aa10: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
aa20: 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
aa30: 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
aa40: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
aa50: 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
aa60: 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
aa70: 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
aa80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
aa90: 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
aaa0: 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
aab0: 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
aac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
aad0: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
aae0: 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 2a 6a         OsFile *j
aaf0: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
ab00: 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
ab10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ab20: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
ab30: 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61  Journal, &journa
ab40: 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  l);.        asse
ab50: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
ab60: 4b 20 7c 7c 20 6a 6f 75 72 6e 61 6c 20 29 3b 0a  K || journal );.
ab70: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
ab80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
ab90: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
aba0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
abb0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
abc0: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
abd0: 72 6e 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a  rnal(journal, &z
abe0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
abf0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
ac00: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
ac10: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ac20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ac30: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
ac40: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
ac50: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
ac60: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
ac70: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
ac80: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
ac90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
aca0: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
acb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
acc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
acd0: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
ace0: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
acf0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ad00: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
ad10: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
ad20: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
ad30: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
ad40: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
ad50: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
ad60: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
ad70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
ad80: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
ad90: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
ada0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
adb0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
adc0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
add0: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
ade0: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
adf0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
ae00: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
ae10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ae20: 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  .}...static void
ae30: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
ae40: 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50 61  cache(Pager *pPa
ae50: 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  ger);../*.** Tru
ae60: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
ae70: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
ae80: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
ae90: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
aea0: 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c 73 6f   indicated. Also
aeb0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
aec0: 63 68 65 64 20 72 65 70 72 65 73 65 6e 74 61 74  ched representat
aed0: 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ion of the file.
aee0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
aef0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
af00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
af10: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
af20: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
af30: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
af40: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
af50: 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
af60: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
af70: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  e(pPager->fd, pP
af80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
af90: 69 36 34 29 6e 50 61 67 65 29 3b 0a 20 20 7d 0a  i64)nPage);.  }.
afa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
afb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
afc0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
afd0: 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
afe0: 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
aff0: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
b000: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
b010: 65 74 20 74 68 65 20 73 65 63 74 6f 72 53 69 7a  et the sectorSiz
b020: 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  e for the given 
b030: 70 61 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  pager..**.** The
b040: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20   sector size is 
b050: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 74 68  the larger of th
b060: 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65  e sector size re
b070: 70 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c  ported.** by sql
b080: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
b090: 28 29 20 61 6e 64 20 74 68 65 20 70 61 67 65 53  () and the pageS
b0a0: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ize..*/.static v
b0b0: 6f 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a  oid setSectorSiz
b0c0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
b0d0: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  {.  pPager->sect
b0e0: 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33  orSize = sqlite3
b0f0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  OsSectorSize(pPa
b100: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 69 66 28 20  ger->fd);.  if( 
b110: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
b120: 7a 65 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ze<pPager->pageS
b130: 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ize ){.    pPage
b140: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
b150: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b160: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
b170: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
b180: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
b190: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
b1a0: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
b1b0: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
b1c0: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
b1d0: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
b1e0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
b1f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
b200: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
b210: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
b220: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
b230: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
b240: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
b250: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
b260: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
b270: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
b280: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
b290: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
b2a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
b2b0: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
b2c0: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
b2d0: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
b2e0: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
b2f0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
b300: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
b310: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
b320: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
b330: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
b340: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
b350: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
b360: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
b370: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
b380: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
b390: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
b3a0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
b3b0: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
b3c0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
b3d0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
b3e0: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
b3f0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
b400: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
b410: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
b420: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
b430: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
b440: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
b450: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
b460: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
b470: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
b480: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
b490: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
b4a0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b4b0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
b4c0: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
b4d0: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
b4e0: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
b4f0: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
b500: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
b510: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
b520: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
b530: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
b540: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
b550: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
b560: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
b570: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
b580: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
b590: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
b5a0: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
b5b0: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
b5c0: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
b5d0: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
b5e0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
b5f0: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
b600: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
b610: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
b620: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
b630: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
b640: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
b650: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
b660: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
b670: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
b680: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
b690: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
b6a0: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
b6b0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
b6c0: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
b6d0: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
b6e0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
b6f0: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
b700: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
b710: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
b720: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
b730: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
b740: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
b750: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
b760: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
b770: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
b780: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
b790: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
b7a0: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
b7b0: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
b7c0: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
b7d0: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
b7e0: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
b7f0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
b800: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b810: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
b820: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
b830: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
b840: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
b850: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
b860: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
b870: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
b880: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
b890: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
b8a0: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
b8b0: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
b8c0: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
b8d0: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
b8e0: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
b8f0: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
b900: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
b910: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
b920: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
b930: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
b940: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
b950: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
b960: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
b970: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
b980: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
b990: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
b9a0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
b9b0: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
b9c0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
b9d0: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
b9e0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
b9f0: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
ba00: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
ba10: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
ba20: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
ba30: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
ba40: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
ba50: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
ba60: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
ba70: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
ba80: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
ba90: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
baa0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
bab0: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
bac0: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
bad0: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
bae0: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
baf0: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
bb00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
bb10: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
bb20: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
bb30: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
bb40: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
bb50: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
bb60: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
bb70: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
bb80: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
bb90: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
bba0: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
bbb0: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
bbc0: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
bbd0: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
bbe0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
bbf0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
bc00: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
bc10: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
bc20: 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f  pPager, int isHo
bc30: 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  t){.  i64 szJ;  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bc50: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * Size of the jo
bc60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62 79  urnal file in by
bc70: 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65  tes */.  u32 nRe
bc80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
bc90: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
bca0: 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a 6f  ecords in the jo
bcb0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69  urnal */.  int i
bcc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bcd0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
bce0: 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  ter */.  Pgno mx
bcf0: 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  Pg = 0;         
bd00: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
bd10: 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20 69   original file i
bd20: 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  n pages */.  int
bd30: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
bd40: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
bd50: 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72 6f 75  code of a subrou
bd60: 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tine */.  char *
bd70: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
bd80: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
bd90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
bda0: 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f  e if any */..  /
bdb0: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
bdc0: 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
bdd0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
bde0: 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
bdf0: 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
be00: 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
be10: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
be20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
be30: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
be40: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
be50: 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
be60: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
be70: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
be80: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
be90: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
bea0: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
beb0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
bec0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
bed0: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
bee0: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
bef0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
bf00: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
bf10: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
bf20: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
bf30: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
bf40: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
bf50: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
bf60: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
bf70: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
bf80: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
bf90: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
bfa0: 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  l(pPager->jfd, &
bfb0: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
bfc0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
bfd0: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
bfe0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
bff0: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
c000: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
c010: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
c020: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
c030: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
c040: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
c050: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
c060: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c070: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
c080: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c  yback;.  }.  sql
c090: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
c0a0: 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50  r->jfd, 0);.  pP
c0b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c0c0: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73   = 0;..  /* This
c0d0: 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
c0e0: 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65   either when the
c0f0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
c100: 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20  ) call returns. 
c110: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20   ** SQLITE_DONE 
c120: 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  or an IO error o
c130: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c  ccurs. */.  whil
c140: 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  e( 1 ){..    /* 
c150: 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
c160: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
c170: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
c180: 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
c190: 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
c1a0: 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
c1b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
c1c0: 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
c1d0: 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
c1e0: 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
c1f0: 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
c200: 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
c210: 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
c220: 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
c230: 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
c240: 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
c250: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
c260: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
c270: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
c280: 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
c290: 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
c2a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c2b0: 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
c2c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
c2d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
c2e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
c2f0: 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
c300: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
c310: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
c320: 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
c330: 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
c340: 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
c350: 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
c360: 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
c370: 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
c380: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
c390: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
c3a0: 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
c3b0: 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
c3c0: 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
c3d0: 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
c3e0: 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
c3f0: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
c400: 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
c410: 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
c420: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c430: 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
c440: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c450: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
c460: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
c470: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
c480: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
c490: 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  J - JOURNAL_HDR_
c4a0: 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52  SZ(pPager))/JOUR
c4b0: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c4c0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c4d0: 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61 6e   If nRec is 0 an
c4e0: 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20  d this rollback 
c4f0: 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  is of a transact
c500: 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20 74  ion created by t
c510: 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
c520: 73 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ss. In this case
c530: 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65   the rest of the
c540: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
c550: 6e 73 69 73 74 73 20 6f 66 0a 20 20 20 20 2a 2a  nsists of.    **
c560: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f 70 69   journalled copi
c570: 65 73 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  es of pages that
c580: 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65 61 64   need to be read
c590: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 63   back into the c
c5a0: 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ache..    */.   
c5b0: 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
c5c0: 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20  !isHot ){.      
c5d0: 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50  nRec = (szJ - pP
c5e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c5f0: 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
c600: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
c610: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
c620: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 68 65   is the first he
c630: 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74  ader read from t
c640: 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e  he journal, trun
c650: 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  cate the.    ** 
c660: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62 61  database file ba
c670: 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69  ck to it's origi
c680: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f  nal size..    */
c690: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
c6a0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
c6b0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c6c0: 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  er) ){.      rc 
c6d0: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
c6e0: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
c6f0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c700: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c710: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
c720: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
c730: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
c740: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
c750: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
c760: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
c770: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
c780: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
c790: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
c7a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
c7b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c7c0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c7d0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
c7e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
c7f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c800: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
c810: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
c820: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
c830: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
c840: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c850: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
c860: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
c870: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c880: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
c890: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
c8a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c8b0: 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
c8c0: 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
c8d0: 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
c8e0: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
c8f0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
c900: 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
c910: 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
c920: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
c930: 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
c940: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
c950: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
c960: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c970: 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
c980: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
c990: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
c9a0: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
c9b0: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
c9c0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
c9d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c9e0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
c9f0: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
ca00: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
ca10: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
ca20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
ca30: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
ca40: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
ca50: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
ca60: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
ca70: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
ca80: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
ca90: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
caa0: 65 72 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a  erent sector siz
cab0: 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65  e.  ** value. Re
cac0: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f  set it to the co
cad0: 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20  rrect value for 
cae0: 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20  this process..  
caf0: 2a 2f 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69  */.  setSectorSi
cb00: 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ze(pPager);.  re
cb10: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cb20: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73  * Playback the s
cb30: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
cb40: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
cb50: 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69  similar to playi
cb60: 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ng back the tran
cb70: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
cb80: 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65  but with.** a fe
cb90: 77 20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a  w extra twists..
cba0: 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68  **.**    (1)  Th
cbb0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
cbc0: 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  s in the databas
cbd0: 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 74  e file at the st
cbe0: 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  art of.**       
cbf0: 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20    the statement 
cc00: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  is stored in pPa
cc10: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e  ger->stmtSize, n
cc20: 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20  ot in the.**    
cc30: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c       journal fil
cc40: 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20  e itself..**.** 
cc50: 20 20 20 28 32 29 20 20 49 6e 20 61 64 64 69 74     (2)  In addit
cc60: 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62  ion to playing b
cc70: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
cc80: 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a  t journal, also.
cc90: 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61 79 62  **         playb
cca0: 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66  ack all pages of
ccb0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
ccc0: 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69   journal beginni
ccd0: 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74  ng.**         at
cce0: 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e   offset pPager->
ccf0: 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74  stmtJSize..*/.st
cd00: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73  atic int pager_s
cd10: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  tmt_playback(Pag
cd20: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
cd30: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cd40: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cd50: 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72  of the full jour
cd60: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72  nal */.  i64 hdr
cd70: 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b  Off;.  int nRec;
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63  /* Number of Rec
cda0: 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ords */.  int i;
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cdc0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
cdd0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  er */.  int rc;.
cde0: 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d  .  szJ = pPager-
cdf0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66  >journalOff;.#if
ce00: 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b  ndef NDEBUG .  {
ce10: 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b  .    i64 os_szJ;
ce20: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
ce30: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
ce40: 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a  er->jfd, &os_szJ
ce50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
ce60: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ce70: 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74  n rc;.    assert
ce80: 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b  ( szJ==os_szJ );
ce90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
cea0: 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20  * Set hdrOff to 
ceb0: 62 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75  be the offset ju
cec0: 73 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  st after the end
ced0: 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75   of the last jou
cee0: 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77  rnal.  ** page w
cef0: 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68  ritten before th
cf00: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
cf10: 68 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20  header for this 
cf20: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
cf30: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77  ransaction was w
cf40: 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65  ritten, or the e
cf50: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
cf60: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
cf70: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
cf80: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
cf90: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
cfa0: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
cfb0: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
cfc0: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
cfd0: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
cfe0: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
cff0: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   szJ;.  }.  .  /
d000: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
d010: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
d020: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
d030: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  e..  */.  rc = p
d040: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
d050: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
d060: 6d 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72  mtSize);.  asser
d070: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
d080: 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
d090: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
d0a0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
d0b0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
d0c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d0d0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d0e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
d0f0: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
d100: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
d110: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
d120: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
d130: 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e   nRec = pPager->
d140: 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f  stmtNRec;.  .  /
d150: 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20  * Copy original 
d160: 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65  pages out of the
d170: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
d180: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
d190: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
d1a0: 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74  se file.  Note t
d1b0: 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
d1c0: 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20  t journal omits 
d1d0: 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20  checksums from. 
d1e0: 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20   ** each record 
d1f0: 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c  since power-fail
d200: 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73 20  ure recovery is 
d210: 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f  not important to
d220: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
d230: 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20  journals..  */. 
d240: 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69   for(i=nRec-1; i
d250: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72  >=0; i--){.    r
d260: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
d270: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
d280: 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64  er, pPager->stfd
d290: 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 0);.    assert
d2a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
d2b0: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
d2c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
d2d0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d2e0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ack;.  }..  /* N
d2f0: 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67  ow roll some pag
d300: 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  es back from the
d310: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
d320: 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74  rnal. Pager.stmt
d330: 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74  JSize.  ** was t
d340: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
d350: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e  ournal file when
d360: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
d370: 77 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a  was started, so.
d380: 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20    ** everything 
d390: 61 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73  after that needs
d3a0: 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61   to be rolled ba
d3b0: 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20  ck, either into 
d3c0: 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  the.  ** databas
d3d0: 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61  e, the memory ca
d3e0: 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20  che, or both..  
d3f0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73  **.  ** If it is
d400: 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20   not zero, then 
d410: 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66  Pager.stmtHdrOff
d420: 20 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74   is the offset t
d430: 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a  o the start.  **
d440: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f   of the first jo
d450: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
d460: 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73  tten during this
d470: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
d480: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72  action..  */.  r
d490: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
d4a0: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  k(pPager->jfd, p
d4b0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
d4c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d4d0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
d4e0: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
d4f0: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
d500: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
d510: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
d520: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
d530: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
d540: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77  ->stmtCksum;.  w
d550: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
d560: 75 72 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66  urnalOff < hdrOf
d570: 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  f ){.    rc = pa
d580: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
d590: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
d5a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
d5b0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d5c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d5d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d5e0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
d5f0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
d600: 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  }..  while( pPag
d610: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
d620: 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20   szJ ){.    u32 
d630: 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f  nJRec;         /
d640: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72  * Number of Jour
d650: 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20  nal Records */. 
d660: 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
d670: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
d680: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
d690: 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d  J, &nJRec, &dumm
d6a0: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
d6b0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d6c0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d6d0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d6e0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
d6f0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
d700: 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d  }.    if( nJRec=
d710: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65  =0 ){.      nJRe
d720: 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
d730: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
d740: 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
d750: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ze+8);.    }.   
d760: 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20   for(i=nJRec-1; 
d770: 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  i>=0 && pPager->
d780: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a  journalOff < szJ
d790: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63  ; i--){.      rc
d7a0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
d7b0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
d7c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
d7d0: 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
d7e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
d7f0: 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  E );.      if( r
d800: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
d810: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
d820: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  yback;.    }.  }
d830: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
d840: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
d850: 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61  .end_stmt_playba
d860: 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ck:.  if( rc==SQ
d870: 4c 49 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70  LITE_OK) {.    p
d880: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
d890: 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20  f = szJ;.    /* 
d8a0: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
d8b0: 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20  he(pPager); */. 
d8c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
d8d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
d8e0: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
d8f0: 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20  er of in-memory 
d900: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
d910: 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  llowed..*/.void 
d920: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43  sqlite3PagerSetC
d930: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
d940: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
d950: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
d960: 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>10 ){.    pPag
d970: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50  er->mxPage = mxP
d980: 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  age;.  }else{.  
d990: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
d9a0: 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   = 10;.  }.}../*
d9b0: 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72  .** Adjust the r
d9c0: 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65  obustness of the
d9d0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d   database to dam
d9e0: 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72  age due to OS cr
d9f0: 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65  ashes.** or powe
da00: 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68  r failures by ch
da10: 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65  anging the numbe
da20: 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68  r of syncs()s wh
da30: 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68  en writing.** th
da40: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
da50: 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74  al.  There are t
da60: 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a  hree levels:.**.
da70: 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20  **    OFF       
da80: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
da90: 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e  is never called.
daa0: 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65    This is the de
dab0: 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20  fault.**        
dac0: 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72        for tempor
dad0: 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e  ary and transien
dae0: 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  t files..**.**  
daf0: 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20    NORMAL    The 
db00: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
db10: 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72  d once before wr
db20: 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68  ites begin on th
db30: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
db40: 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69    database.  Thi
db50: 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64  s is normally ad
db60: 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f  equate protectio
db70: 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20  n, but.**       
db80: 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65         it is the
db90: 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69  oretically possi
dba0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79  ble, though very
dbb0: 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20   unlikely,.**   
dbc0: 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20             that 
dbd0: 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f  an inopertune po
dbe0: 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c  wer failure coul
dbf0: 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72  d leave the jour
dc00: 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
dc10: 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77      in a state w
dc20: 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65  hich would cause
dc30: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
dc40: 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20  atabase.**      
dc50: 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20          when it 
dc60: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  is rolled back..
dc70: 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20  **.**    FULL   
dc80: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
dc90: 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62  s synced twice b
dca0: 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67  efore writes beg
dcb0: 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20  in on the.**    
dcc0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
dcd0: 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64  se (with some ad
dce0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
dcf0: 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20  tion - the nRec 
dd00: 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20  field.**        
dd10: 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75        of the jou
dd20: 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65  rnal header - be
dd30: 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62  ing written in b
dd40: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a  etween the two.*
dd50: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
dd60: 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73  yncs).  If we as
dd70: 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e  sume that writin
dd80: 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  g a.**          
dd90: 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20      single disk 
dda0: 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63  sector is atomic
ddb0: 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65  , then this mode
ddc0: 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20   provides.**    
ddd0: 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61            assura
dde0: 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75  nce that the jou
ddf0: 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rnal will not be
de00: 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68   corrupted to th
de10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
de20: 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69    point of causi
de30: 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  ng damage to the
de40: 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67   database during
de50: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
de60: 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20   Numeric values 
de70: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
de80: 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65  these states are
de90: 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d   OFF==1, NORMAL=
dea0: 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33  2,.** and FULL=3
deb0: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
dec0: 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50  ITE_OMIT_PAGER_P
ded0: 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69  RAGMAS.void sqli
dee0: 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74  te3PagerSetSafet
def0: 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  yLevel(Pager *pP
df00: 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  ager, int level,
df10: 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29   int full_fsync)
df20: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
df30: 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
df40: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
df50: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
df60: 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
df70: 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
df80: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
df90: 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66  ->full_fsync = f
dfa0: 75 6c 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28  ull_fsync;.  if(
dfb0: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
dfc0: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
dfd0: 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  nc = 0;.}.#endif
dfe0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
dff0: 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72  owing global var
e000: 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65  iable is increme
e010: 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74 68  nted whenever th
e020: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74  e library.** att
e030: 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20  empts to open a 
e040: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
e050: 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f   This informatio
e060: 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  n is used for.**
e070: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
e080: 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f  lysis only.  .*/
e090: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
e0a0: 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
e0b0: 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d  opentemp_count =
e0c0: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
e0d0: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
e0e0: 72 79 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  ry file. .**.** 
e0f0: 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
e100: 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
e110: 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  fd.  Return SQLI
e120: 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
e130: 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65   or some.** othe
e140: 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  r error code if 
e150: 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54  we fail..**.** T
e160: 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d  he OS will autom
e170: 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20  atically delete 
e180: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  the temporary fi
e190: 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a  le when it is.**
e1a0: 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74   closed..*/.stat
e1b0: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61  ic int sqlite3Pa
e1c0: 67 65 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69  gerOpentemp(OsFi
e1d0: 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74  le **pFd){.  int
e1e0: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
e1f0: 72 63 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65  rc;.  char zFile
e200: 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45  [SQLITE_TEMPNAME
e210: 5f 53 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20  _SIZE];..#ifdef 
e220: 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
e230: 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
e240: 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
e250: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
e260: 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
e270: 2f 0a 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20  /.#endif.  do{. 
e280: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
e290: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
e2a0: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
e2b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e2c0: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
e2d0: 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 20 20  e, pFd, 1);.    
e2e0: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
e2f0: 54 45 5f 4f 4b 20 7c 7c 20 2a 70 46 64 20 29 3b  TE_OK || *pFd );
e300: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
e310: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
e320: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
e330: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
e340: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
e350: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
e360: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
e370: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e380: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
e390: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
e3a0: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
e3b0: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
e3c0: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
e3d0: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
e3e0: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
e3f0: 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
e400: 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  Get() and is onl
e410: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
e420: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
e430: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
e440: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
e450: 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  rUnref()..**.** 
e460: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e470: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
e480: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
e490: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
e4a0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
e4b0: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
e4c0: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
e4d0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
e4e0: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
e4f0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
e500: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
e510: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
e520: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
e530: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
e540: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
e550: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
e560: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
e570: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
e580: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
e590: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
e5a0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
e5b0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
e5c0: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
e5d0: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
e5e0: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
e5f0: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
e600: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e610: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
e620: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
e630: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
e640: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
e650: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
e660: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
e670: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
e680: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
e690: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e6b0: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
e6c0: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
e6d0: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
e6e0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
e6f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
e700: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
e710: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73    /* Compiler is
e720: 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20   wrong. This is 
e730: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
e740: 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f  ed before use */
e750: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20  .  OsFile *fd = 
e760: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
e770: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
e780: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
e790: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
e7a0: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
e7b0: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74  dOnly = 0;.  int
e7c0: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
e7d0: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
e7e0: 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20  T_JOURNAL)==0;. 
e7f0: 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
e800: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
e810: 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
e820: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
e830: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
e840: 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  IZE];.#ifdef SQL
e850: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
e860: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
e870: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e  * A malloc() can
e880: 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69  not fail in sqli
e890: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
e8a0: 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  as one or more c
e8b0: 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61  alls to .  ** ma
e8c0: 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65  lloc() must have
e8d0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
e8e0: 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61  de by this threa
e8f0: 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73  d before it gets
e900: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f  .  ** to this po
e910: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
e920: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d  the ThreadData m
e930: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ust have been al
e940: 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a  located already.
e950: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72    ** so that Thr
e960: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63  eadData.nAlloc c
e970: 61 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f  an be set. It wo
e980: 75 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61  uld be nice to a
e990: 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20  ssert.  ** that 
e9a0: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
e9b0: 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62  c is non-zero, b
e9c0: 75 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65  ut alas this bre
e9d0: 61 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a  aks test cases .
e9e0: 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
e9f0: 69 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72  invoke the pager
ea00: 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a   directly..  */.
ea10: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
ea20: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
ea30: 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65  adData();.  asse
ea40: 72 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64  rt( pTsd );.#end
ea50: 69 66 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64  if..  /* We used
ea60: 20 74 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c   to test if mall
ea70: 6f 63 28 29 20 68 61 64 20 61 6c 72 65 61 64 79  oc() had already
ea80: 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70   failed before p
ea90: 72 6f 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a  roceeding. .  **
eaa0: 20 42 75 74 20 74 68 65 20 77 61 79 20 74 68 69   But the way thi
eab0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
eac0: 65 64 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61  ed in SQLite mea
ead0: 6e 73 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65  ns that can neve
eae0: 72 0a 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46  r.  ** happen. F
eaf0: 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74  urthermore, if t
eb00: 68 65 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  he malloc-failed
eb10: 20 66 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79   flag is already
eb20: 20 73 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68   set, .  ** eith
eb30: 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
eb40: 71 6c 69 74 65 53 74 72 44 75 70 28 29 20 6f 72  qliteStrDup() or
eb50: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
eb60: 62 65 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20  below will.  ** 
eb70: 66 61 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64  fail shortly and
eb80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65   SQLITE_NOMEM re
eb90: 74 75 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20  turned anyway.. 
eba0: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
ebb0: 20 30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   0;..  /* Open t
ebc0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e  he pager file an
ebd0: 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e  d set zFullPathn
ebe0: 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ame to point at 
ebf0: 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a  malloc()ed .  **
ec00: 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69   memory containi
ec10: 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ng the complete 
ec20: 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69  filename (i.e. i
ec30: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72  ncluding the dir
ec40: 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20  ectory)..  */.  
ec50: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
ec60: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
ec70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
ec80: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
ec90: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
eca0: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
ecb0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
ecc0: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
ecd0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
ece0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29  sqliteStrDup("")
ecf0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
ed00: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
ed10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ed20: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ed30: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
ed40: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
ed50: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
ed60: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ed70: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
ed80: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
ed90: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
eda0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
edb0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
edc0: 20 66 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20   fd );.      }. 
edd0: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
ede0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
edf0: 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 66 64 29  gerOpentemp(&fd)
ee00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
ee10: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65 6d  empFileName(zTem
ee20: 70 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  p);.    zFilenam
ee30: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
ee40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
ee50: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
ee60: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
ee70: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ee80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ee90: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
eea0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c    }.  }..  /* Al
eeb0: 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72  locate the Pager
eec0: 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20 70   structure. As p
eed0: 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65 20  art of the same 
eee0: 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c 6f  allocation, allo
eef0: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
ef00: 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61 74  for the full pat
ef10: 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c 20  hs of the file, 
ef20: 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a 6f  directory and jo
ef30: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61 67  urnal .  ** (Pag
ef40: 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50 61  er.zFilename, Pa
ef50: 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20 61  ger.zDirectory a
ef60: 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61  nd Pager.zJourna
ef70: 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  l)..  */.  if( z
ef80: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
ef90: 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74      nameLen = st
efa0: 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61  rlen(zFullPathna
efb0: 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  me);.    pPager 
efc0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
efd0: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
efe0: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
eff0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
f000: 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  er && rc==SQLITE
f010: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
f020: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  ger->pTmpSpace =
f030: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
f040: 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45 5f  allocRaw(SQLITE_
f050: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
f060: 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  E);.    }.  }...
f070: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
f080: 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
f090: 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
f0a0: 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
f0b0: 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f   memory .  ** po
f0c0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c  inted to by zFul
f0d0: 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20  lPathname, free 
f0e0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
f0f0: 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
f100: 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69  e .  ** file. Si
f110: 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
f120: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
f130: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
f140: 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
f150: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
f160: 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
f170: 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
f180: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c  !zFullPathname |
f190: 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
f1a0: 70 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c 49  pace || rc!=SQLI
f1b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
f1c0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
f1d0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
f1e0: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
f1f0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f200: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
f210: 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54 45  urn ((rc==SQLITE
f220: 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45  _OK)?SQLITE_NOME
f230: 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50 41  M:rc);.  }..  PA
f240: 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e 20  GERTRACE3("OPEN 
f250: 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
f260: 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c  NDLEID(fd), zFul
f270: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49 4f  lPathname);.  IO
f280: 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20  TRACE(("OPEN %p 
f290: 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 7a  %s\n", pPager, z
f2a0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a 20  FullPathname)). 
f2b0: 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
f2c0: 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50 61  me = (char*)&pPa
f2d0: 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65 72  ger[1];.  pPager
f2e0: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
f2f0: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
f300: 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  e[nameLen+1];.  
f310: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
f320: 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69 72   = &pPager->zDir
f330: 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31  ectory[nameLen+1
f340: 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  ];.  memcpy(pPag
f350: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
f360: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61  FullPathname, na
f370: 6d 65 4c 65 6e 2b 31 29 3b 0a 20 20 6d 65 6d 63  meLen+1);.  memc
f380: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
f390: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
f3a0: 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29  name, nameLen+1)
f3b0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  ;..  for(i=nameL
f3c0: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
f3d0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
f3e0: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
f3f0: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
f400: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
f410: 2d 31 5d 20 3d 20 30 3b 0a 20 20 6d 65 6d 63 70  -1] = 0;.  memcp
f420: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
f430: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
f440: 65 2c 6e 61 6d 65 4c 65 6e 29 3b 0a 20 20 73 71  e,nameLen);.  sq
f450: 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61  liteFree(zFullPa
f460: 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70  thname);.  memcp
f470: 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  y(&pPager->zJour
f480: 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d  nal[nameLen], "-
f490: 6a 6f 75 72 6e 61 6c 22 2c 73 69 7a 65 6f 66 28  journal",sizeof(
f4a0: 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 3b 0a 20 20  "-journal"));.  
f4b0: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
f4c0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
f4d0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
f4e0: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
f4f0: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
f500: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
f510: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
f520: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
f530: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
f540: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
f550: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
f560: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
f570: 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
f580: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
f590: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
f5a0: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
f5b0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
f5c0: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
f5d0: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
f5e0: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
f5f0: 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
f600: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
f610: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
f620: 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
f630: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
f640: 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a  ->mxPage = 100;.
f650: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
f660: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
f670: 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 61 73 73 65  GE_COUNT;.  asse
f680: 72 74 28 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  rt( PAGER_UNLOCK
f690: 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67  ==0 );.  /* pPag
f6a0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
f6b0: 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f  R_UNLOCK; */.  /
f6c0: 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  * pPager->errMas
f6d0: 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  k = 0; */.  pPag
f6e0: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74  er->tempFile = t
f6f0: 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65 72  empFile;.  asser
f700: 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47  t( tempFile==PAG
f710: 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
f720: 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20 20  ORMAL .         
f730: 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41   || tempFile==PA
f740: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
f750: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
f760: 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
f770: 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
f780: 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67 65  VE==1 );.  pPage
f790: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
f7a0: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20   = tempFile; .  
f7b0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
f7c0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
f7d0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
f7e0: 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
f7f0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
f800: 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f   */.  pPager->no
f810: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
f820: 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a  empFile || !useJ
f830: 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
f840: 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50  ->fullSync = (pP
f850: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31  ager->noSync?0:1
f860: 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
f870: 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
f880: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
f890: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
f8a0: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
f8b0: 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
f8c0: 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46  ager->nExtra = F
f8d0: 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
f8e0: 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74  Extra);.  assert
f8f0: 28 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69  (fd||memDb);.  i
f900: 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20  f( !memDb ){.   
f910: 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70   setSectorSize(p
f920: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Pager);.  }.  /*
f930: 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
f940: 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20  ndler = 0; */.  
f950: 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
f960: 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
f970: 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
f980: 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  )); */.  *ppPage
f990: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64  r = pPager;.#ifd
f9a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
f9b0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
f9c0: 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e 70 4e 65  NT.  pPager->pNe
f9d0: 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  xt = pTsd->pPage
f9e0: 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61 67 65  r;.  pTsd->pPage
f9f0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65 6e 64  r = pPager;.#end
fa00: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
fa10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fa20: 53 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e  Set the busy han
fa30: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  dler function..*
fa40: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
fa50: 67 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65  gerSetBusyhandle
fa60: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
fa70: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
fa80: 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70  usyHandler){.  p
fa90: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
faa0: 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  ler = pBusyHandl
fab0: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
fac0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
fad0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
fae0: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
faf0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
fb00: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
fb10: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
fb20: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
fb30: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
fb40: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
fb50: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
fb60: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
fb70: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
fb80: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
fb90: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
fba0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
fbb0: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
fbc0: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
fbd0: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
fbe0: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
fbf0: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
fc00: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33  alled by sqlite3
fc10: 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f  PagerUnref()..*/
fc20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
fc30: 65 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28  erSetDestructor(
fc40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
fc50: 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50  oid (*xDesc)(DbP
fc60: 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50  age*,int)){.  pP
fc70: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
fc80: 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a  r = xDesc;.}../*
fc90: 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
fca0: 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
fcb0: 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f  is pager.  If no
fcc0: 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e  t NULL, the rein
fcd0: 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20  itializer.** is 
fce0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  called when the 
fcf0: 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67  content of a pag
fd00: 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65  e in cache is re
fd10: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
fd20: 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20  iginal.** value 
fd30: 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61  as a result of a
fd40: 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
fd50: 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68  callback gives h
fd60: 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65  igher-level code
fd70: 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69  .** an opportuni
fd80: 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ty to restore th
fd90: 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20  e EXTRA section 
fda0: 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68  to agree with th
fdb0: 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61  e restored.** pa
fdc0: 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64  ge data..*/.void
fdd0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
fde0: 52 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a  Reiniter(Pager *
fdf0: 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
fe00: 52 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c  Reinit)(DbPage*,
fe10: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
fe20: 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65  >xReiniter = xRe
fe30: 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  init;.}../*.** S
fe40: 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  et the page size
fe50: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65  .  Return the ne
fe60: 77 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20  w size.  If the 
fe70: 73 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65  suggest new page
fe80: 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70  .** size is inap
fe90: 70 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20  propriate, then 
fea0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
feb0: 61 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65  age size is sele
fec0: 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75  cted.** and retu
fed0: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
fee0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
fef0: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
ff00: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
ff10: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
ff20: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
ff30: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
ff40: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
ff50: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6d    if( !pPager->m
ff60: 65 6d 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e  emDb && pPager->
ff70: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70  nRef==0 ){.    p
ff80: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
ff90: 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
ffa0: 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
ffb0: 69 7a 65 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ize;.    pPager-
ffc0: 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c  >pTmpSpace = sql
ffd0: 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46 72 65  ite3ReallocOrFre
ffe0: 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
fff0: 61 63 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a  ace, pageSize);.
10000 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 50 61    }.  return pPa
10010 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d  ger->pageSize;.}
10020 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
10030 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d  to set the maxim
10040 75 6d 20 64 61 74 61 62 61 73 65 20 70 61 67 65  um database page
10050 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65   count if mxPage
10060 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a   is positive. .*
10070 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
10080 73 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a  s if mxPage is z
10090 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e  ero or negative.
100a0 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75    And never redu
100b0 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75  ce the.** maximu
100c0 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c  m page count bel
100d0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
100e0 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
100f0 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72  ase..**.** Regar
10100 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c  dless of mxPage,
10110 20 72 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   return the curr
10120 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  ent maximum page
10130 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73   count..*/.int s
10140 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
10150 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  geCount(Pager *p
10160 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67  Pager, int mxPag
10170 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65  e){.  if( mxPage
10180 3e 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  >0 ){.    pPager
10190 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67  ->mxPgno = mxPag
101a0 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
101b0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
101c0 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
101d0 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b   pPager->mxPgno;
101e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
101f0 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72  llowing set of r
10200 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65 64  outines are used
10210 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20   to disable the 
10220 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f  simulated.** I/O
10230 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d   error mechanism
10240 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65  .  These routine
10250 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 76  s are used to av
10260 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  oid simulated.**
10270 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65   errors in place
10280 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f  s where we do no
10290 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72 72  t care about err
102a0 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73  ors..**.** Unles
102b0 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d  s -DSQLITE_TEST=
102c0 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73 65  1 is used, these
102d0 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c   routines are al
102e0 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20  l no-ops.** and 
102f0 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65  generate no code
10300 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
10310 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69  TE_TEST.extern i
10320 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
10330 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74  ror_pending;.ext
10340 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
10350 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74  io_error_hit;.st
10360 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63  atic int saved_c
10370 6e 74 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  nt;.void disable
10380 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10390 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
103a0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
103b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
103c0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
103d0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
103e0 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
103f0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10400 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
10410 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10420 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
10430 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
10440 64 65 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73  define disable_s
10450 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10460 72 73 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e  rs().# define en
10470 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
10480 6f 5f 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69  o_errors().#endi
10490 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  f../*.** Read th
104a0 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
104b0 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
104c0 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
104d0 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
104e0 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
104f0 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72  to. .**.** No er
10500 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20  ror checking is 
10510 64 6f 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e  done. The ration
10520 61 6c 20 66 6f 72 20 74 68 69 73 20 69 73 20 74  al for this is t
10530 68 61 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hat this functio
10540 6e 20 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c  n .** may be cal
10550 6c 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20  led even if the 
10560 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
10570 69 73 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61  ist or contain a
10580 20 68 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20   header. In .** 
10590 74 68 65 73 65 20 63 61 73 65 73 20 73 71 6c 69  these cases sqli
105a0 74 65 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c  te3OsRead() will
105b0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
105c0 2c 20 74 6f 20 77 68 69 63 68 20 74 68 65 20 63  , to which the c
105d0 6f 72 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f  orrect .** respo
105e0 6e 73 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74  nse is to zero t
105f0 68 65 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65  he memory at pDe
10600 73 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e  st and continue.
10610 20 20 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f    A real IO erro
10620 72 20 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75  r .** will presu
10630 6d 61 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20  mably recur and 
10640 62 65 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74  be picked up lat
10650 65 72 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20  er (Todo: Think 
10660 61 62 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a  about this)..*/.
10670 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
10680 52 65 61 64 46 69 6c 65 68 65 61 64 65 72 28 50  ReadFileheader(P
10690 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
106a0 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
106b0 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e  ar *pDest){.  in
106c0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
106d0 3b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  ;.  memset(pDest
106e0 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d  , 0, N);.  if( M
106f0 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 64  EMDB==0 ){.    d
10700 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10710 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
10720 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
10730 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
10740 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
10750 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10760 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  ;.    IOTRACE(("
10770 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e 22  DBHDR %p 0 %d\n"
10780 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20 20  , pPager, N)).  
10790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
107a0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
107b0 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 20 20   pDest, N);.    
107c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
107d0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
107e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
107f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
10800 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10810 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
10820 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
10830 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
10840 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63   disk file assoc
10850 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50  iated with.** pP
10860 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  ager. .**.** If 
10870 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  the PENDING_BYTE
10880 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67   lies on the pag
10890 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72  e directly after
108a0 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
108b0 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f  ** file, then co
108c0 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65  nsider this page
108d0 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c   part of the fil
108e0 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70  e too. For examp
108f0 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e  le, if.** PENDIN
10900 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34  G_BYTE is byte 4
10910 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62  096 (the first b
10920 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61  yte of page 5) a
10930 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
10940 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30  he.** file is 40
10950 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72  96 bytes, 5 is r
10960 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20  eturned instead 
10970 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  of 4..*/.int sql
10980 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
10990 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
109a0 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 69 6e  ){.  i64 n;.  in
109b0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
109c0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
109d0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
109e0 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
109f0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
10a00 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
10a10 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
10a20 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
10a30 6c 73 65 20 7b 0a 20 20 20 20 69 66 28 20 28 72  lse {.    if( (r
10a40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
10a50 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  eSize(pPager->fd
10a60 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f  , &n))!=SQLITE_O
10a70 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  K ){.      pager
10a80 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
10a90 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
10aa0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
10ab0 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
10ac0 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
10ad0 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
10ae0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
10af0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
10b00 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
10b10 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
10b20 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
10b30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
10b40 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d  bSize = n;.    }
10b50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50  .  }.  if( n==(P
10b60 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
10b70 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
10b80 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
10b90 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78  if( n>pPager->mx
10ba0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
10bb0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a  er->mxPgno = n;.
10bc0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
10bd0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
10be0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
10bf0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50  ./*.** Clear a P
10c00 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a  gHistory block.*
10c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
10c20 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73  earHistory(PgHis
10c30 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20  tory *pHist){.  
10c40 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
10c50 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69  ->pOrig);.  sqli
10c60 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
10c70 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70  tmt);.  pHist->p
10c80 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73  Orig = 0;.  pHis
10c90 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  t->pStmt = 0;.}.
10ca0 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c  #else.#define cl
10cb0 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65  earHistory(x).#e
10cc0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  ndif../*.** Forw
10cd0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
10ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
10cf0 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
10d00 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  );../*.** Unlink
10d10 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
10d20 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20  ash chain. Also 
10d30 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  set the page num
10d40 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69  ber to 0 to indi
10d50 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65  cate.** that the
10d60 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72   page is not par
10d70 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68  t of any hash ch
10d80 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71  ain. This is req
10d90 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68  uired because th
10da0 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  e.** sqlite3Page
10db0 72 4d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  rMovepage() rout
10dc0 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
10dd0 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
10de0 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
10df0 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
10e00 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
10e10 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
10e20 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
10e30 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
10e40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
10e50 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
10e60 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
10e70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
10e80 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26  >pNextHash==0 &&
10e90 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d   pPg->pPrevHash=
10ea0 3d 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  =0 );.    return
10eb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
10ec0 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
10ed0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
10ee0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
10ef0 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20  g->pPrevHash;.  
10f00 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  }.  if( pPg->pPr
10f10 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73  evHash ){.    as
10f20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
10f30 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20  ash[pPg->pgno & 
10f40 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
10f50 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  )]!=pPg );.    p
10f60 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70  Pg->pPrevHash->p
10f70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
10f80 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c  pNextHash;.  }el
10f90 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20  se{.    int h = 
10fa0 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61  pPg->pgno & (pPa
10fb0 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
10fc0 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
10fd0 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
10fe0 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Hash;.  }.  if( 
10ff0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65  MEMDB ){.    cle
11000 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
11010 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
11020 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67  ger));.  }.  pPg
11030 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
11040 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
11050 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
11060 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
11070 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
11080 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
11090 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
110a0 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
110b0 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
110c0 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
110d0 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
110e0 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
110f0 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
11100 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
11110 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
11120 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
11130 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
11140 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
11150 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
11160 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
11170 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
11180 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
11190 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
111a0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
111b0 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
111c0 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
111d0 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
111e0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
111f0 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
11200 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
11210 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
11220 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
11230 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
11240 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
11250 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
11260 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
11270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
11280 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
11290 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
112a0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
112b0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
112c0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
112d0 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
112e0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
112f0 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
11300 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
11310 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
11320 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
11330 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
11340 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
11350 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
11360 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
11370 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
11380 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
11390 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
113a0 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
113b0 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
113c0 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
113d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
113e0 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
113f0 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61 63  truncate the cac
11400 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  he when a databa
11410 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61 74  se.** is truncat
11420 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20 74  ed.  Drop from t
11430 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61 67  he cache all pag
11440 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73  es whose pgno is
11450 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e 20  .** larger than 
11460 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
11470 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
11480 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ed..**.** Refere
11490 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
114a0 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
114b0 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
114c0 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c 79  ..**.** Actually
114d0 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 74  , at the point t
114e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
114f0 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64 20  alled, it would 
11500 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74  be.** an error t
11510 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65 6e  o have a referen
11520 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20 72  ced page.  But r
11530 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65 74  ather than delet
11540 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 61  e.** that page a
11550 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20 73  nd guarantee a s
11560 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61 75  ubsequent segfau
11570 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65 74  lt, it seems bet
11580 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20 69  ter.** to zero i
11590 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74 20  t and hope that 
115a0 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61 6e  we error out san
115b0 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ely..*/.static v
115c0 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
115d0 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
115e0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
115f0 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
11600 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
11610 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
11620 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
11630 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
11640 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
11650 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
11660 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
11670 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
11680 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
11690 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
116a0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
116b0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
116c0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
116d0 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
116e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
116f0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
11700 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
11710 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
11720 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
11730 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
11740 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
11750 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
11760 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
11770 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
11780 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
11790 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  );.      unlinkP
117a0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
117b0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
117c0 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
117d0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
117e0 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
117f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
11800 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61   Try to obtain a
11810 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e   lock on a file.
11820 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73    Invoke the bus
11830 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
11840 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72  e lock.** is cur
11850 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
11860 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75 6e  able.  Repeat un
11870 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
11880 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
11890 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
118a0 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
118b0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
118c0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
118d0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
118e0 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
118f0 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
11900 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
11910 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
11920 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
11930 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
11940 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
11950 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f  ..  /* The OS lo
11960 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  ck values must b
11970 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74 68  e the same as th
11980 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c  e Pager lock val
11990 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ues */.  assert(
119a0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
119b0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
119c0 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
119d0 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
119e0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
119f0 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
11a00 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
11a10 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  CK );..  /* If t
11a20 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72 65  he file is curre
11a30 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68  ntly unlocked th
11a40 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74  en the size must
11a50 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a 20   be unknown */. 
11a60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11a70 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11a80 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ARED || pPager->
11a90 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d 44  dbSize<0 || MEMD
11aa0 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  B );..  if( pPag
11ab0 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
11ac0 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
11ad0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
11ae0 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  se{.    do {.   
11af0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11b00 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
11b10 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
11b20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11b30 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69  ITE_BUSY && sqli
11b40 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
11b50 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
11b60 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20  syHandler) );.  
11b70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
11b90 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63  ger->state = loc
11ba0 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f 54  ktype;.      IOT
11bb0 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20 25  RACE(("LOCK %p %
11bc0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c 6f  d\n", pPager, lo
11bd0 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a 20  cktype)).    }. 
11be0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
11bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
11c00 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
11c10 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
11c20 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
11c30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
11c40 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
11c50 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
11c60 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
11c70 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11c80 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
11c90 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29 3b  ARED || MEMDB );
11ca0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
11cb0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
11cc0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11cd0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
11ce0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
11cf0 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ode;.    return 
11d00 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  rc;.  }.  if( nP
11d10 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70  age>=(unsigned)p
11d20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
11d30 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11d40 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
11d50 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
11d60 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
11d70 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Page;.    pager_
11d80 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
11d90 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
11da0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11db0 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  }.  rc = syncJou
11dc0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
11dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11de0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
11df0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rc;.  }..  /* Ge
11e00 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
11e10 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
11e20 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63  ase before trunc
11e30 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  ating. */.  rc =
11e40 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
11e50 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
11e60 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69  USIVE_LOCK);.  i
11e70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11e80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
11e90 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  c;.  }..  rc = p
11ea0 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
11eb0 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
11ec0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11ed0 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
11ee0 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
11ef0 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
11f00 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
11f10 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
11f20 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
11f30 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
11f40 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11f50 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
11f60 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
11f70 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
11f80 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
11f90 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
11fa0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
11fb0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
11fc0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
11fd0 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
11fe0 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
11ff0 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
12000 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
12010 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
12020 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
12030 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
12040 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12050 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65 65  on always succee
12060 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63  ds. If a transac
12070 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
12080 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73 20  n attempt.** is 
12090 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74 20  made to roll it 
120a0 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72 6f  back. If an erro
120b0 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
120c0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a  the rollback .**
120d0 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d   a hot journal m
120e0 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ay be left in th
120f0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75 74  e filesystem but
12100 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65 74   no error is ret
12110 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  urned.** to the 
12120 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  caller..*/.int s
12130 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
12140 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12150 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12160 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
12170 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d  AGEMENT.  /* A m
12180 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66  alloc() cannot f
12190 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68  ail in sqlite3Th
121a0 72 65 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e  readData() as on
121b0 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20  e or more calls 
121c0 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28  to .  ** malloc(
121d0 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
121e0 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79  ady been made by
121f0 20 74 68 69 73 20 74 68 72 65 61 64 20 62 65 66   this thread bef
12200 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a  ore it gets.  **
12210 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20   to this point. 
12220 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54  This means the T
12230 68 72 65 61 64 44 61 74 61 20 6d 75 73 74 20 68  hreadData must h
12240 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  ave been allocat
12250 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ed already.  ** 
12260 73 6f 20 74 68 61 74 20 54 68 72 65 61 64 44 61  so that ThreadDa
12270 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65  ta.nAlloc can be
12280 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54 68 72   set..  */.  Thr
12290 65 61 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20  eadData *pTsd = 
122a0 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
122b0 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  a();.  assert( p
122c0 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73 65 72  Pager );.  asser
122d0 74 28 20 70 54 73 64 20 26 26 20 70 54 73 64 2d  t( pTsd && pTsd-
122e0 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e 64 69  >nAlloc );.#endi
122f0 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  f..  disable_sim
12300 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
12310 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  ();.  pPager->er
12320 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61  rCode = 0;.  pPa
12330 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
12340 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f  de = 0;.  pager_
12350 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
12360 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
12370 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
12380 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  .  enable_simula
12390 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
123a0 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
123b0 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47  CLOSE %d\n", PAG
123c0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
123d0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
123e0 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
123f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12400 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70  r->errCode || (p
12410 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12420 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  en==0 && pPager-
12430 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b  >stmtOpen==0) );
12440 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
12450 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
12460 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
12470 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
12480 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
12490 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
124a0 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
124b0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
124c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
124d0 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  se(&pPager->stfd
124e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
124f0 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
12500 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20  >fd);.  /* Temp 
12510 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61  files are automa
12520 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20  tically deleted 
12530 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69  by the OS.  ** i
12540 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  f( pPager->tempF
12550 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71  ile ){.  **   sq
12560 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
12570 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
12580 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 23  ;.  ** }.  */..#
12590 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
125a0 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
125b0 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d 6f 76  EMENT.  /* Remov
125c0 65 20 74 68 65 20 70 61 67 65 72 20 66 72 6f 6d  e the pager from
125d0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
125e0 20 6f 66 20 70 61 67 65 72 73 20 73 74 61 72 74   of pagers start
125f0 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54 68 72  ing at .  ** Thr
12600 65 61 64 44 61 74 61 2e 70 50 61 67 65 72 20 69  eadData.pPager i
12610 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  f memory-managem
12620 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a  ent is enabled..
12630 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
12640 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72 20  r==pTsd->pPager 
12650 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50 61  ){.    pTsd->pPa
12660 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ger = pPager->pN
12670 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ext;.  }else{.  
12680 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a 20    Pager *pTmp;. 
12690 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70 54     for(pTmp = pT
126a0 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d 70  sd->pPager; pTmp
126b0 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72 3b  ->pNext!=pPager;
126c0 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
126d0 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d 3e 70  t){}.    pTmp->p
126e0 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Next = pPager->p
126f0 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Next;.  }.#endif
12700 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
12710 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
12720 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
12730 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
12740 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
12750 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
12760 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12770 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67  * Return the pag
12780 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  e number for the
12790 20 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61   given page data
127a0 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65  ..*/.Pgno sqlite
127b0 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72  3PagerPagenumber
127c0 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72  (DbPage *p){.  r
127d0 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
127e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
127f0 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
12800 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
12810 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
12820 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
12830 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
12840 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
12850 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
12860 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
12870 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
12880 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
12890 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
128a0 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
128b0 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
128c0 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
128d0 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
128e0 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
128f0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
12900 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
12910 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
12920 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
12930 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
12940 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
12950 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
12960 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
12970 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
12980 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
12990 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
129a0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
129b0 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
129c0 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
129d0 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
129e0 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
129f0 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  Pg==pPg->pPager-
12a00 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
12a10 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20  .      PgHdr *p 
12a20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
12a30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
12a40 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
12a50 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
12a60 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67  ree; }.      pPg
12a70 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
12a80 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
12a90 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
12aa0 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
12ab0 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
12ac0 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
12ad0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
12ae0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
12af0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
12b00 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
12b10 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ree;.    }.    i
12b20 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
12b30 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
12b40 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
12b50 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
12b60 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  vFree;.    }else
12b70 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
12b80 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
12b90 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
12ba0 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
12bb0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
12bc0 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
12bd0 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
12be0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
12bf0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
12c00 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
12c10 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
12c20 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
12c30 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
12c40 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
12c50 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
12c60 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
12c70 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
12c80 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
12c90 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
12ca0 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
12cb0 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
12cc0 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
12cd0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
12ce0 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
12cf0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
12d00 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
12d10 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
12d20 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
12d30 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
12d40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
12d50 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67 29  Ref(DbPage *pPg)
12d60 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  {.  page_ref(pPg
12d70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
12d80 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
12d90 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
12da0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
12db0 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
12dc0 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
12dd0 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
12de0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
12df0 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
12e00 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
12e10 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
12e20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
12e30 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
12e40 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
12e50 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
12e60 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
12e70 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
12e80 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
12e90 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
12ea0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
12eb0 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
12ec0 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
12ed0 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
12ee0 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
12ef0 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
12f00 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
12f10 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
12f20 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
12f30 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
12f40 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
12f50 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
12f60 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
12f70 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
12f80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12f90 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
12fa0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
12fb0 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
12fc0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
12fd0 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
12fe0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
12ff0 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
13000 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
13010 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
13020 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
13030 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
13040 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
13050 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
13060 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
13070 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
13080 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
13090 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
130a0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
130b0 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
130c0 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
130d0 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
130e0 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
130f0 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
13100 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
13110 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   so sync occurs.
13120 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13130 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
13140 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
13150 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
13160 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
13170 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
13180 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
13190 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
131a0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
131b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
131c0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  _OK;..  /* Sync 
131d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
131e0 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
131f0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
13200 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
13210 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
13220 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
13230 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
13240 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
13250 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
13260 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
13270 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61  pFile ){.      a
13280 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13290 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
132a0 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
132b0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
132c0 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
132d0 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
132e0 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
132f0 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
13300 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
13310 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
13320 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
13330 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
13340 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
13350 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
13360 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
13370 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
13380 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
13390 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
133a0 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
133b0 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
133c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
133d0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
133e0 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
133f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13400 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
13410 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29  ager->jfd, &jSz)
13420 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13430 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
13440 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
13450 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13460 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20  Off==jSz );.    
13470 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
13480 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72   {.        /* Wr
13490 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
134a0 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
134b0 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
134c0 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
134d0 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
134e0 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
134f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
13500 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
13510 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
13520 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
13530 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
13540 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
13550 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
13560 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
13570 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
13580 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20  ollback. .      
13590 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
135a0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
135b0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  c ){.          P
135c0 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
135d0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
135e0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
135f0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  r));.          I
13600 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
13610 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
13620 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
13630 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
13640 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
13650 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
13660 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
13670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13680 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
13690 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  ek(pPager->jfd,.
136a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
136b0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
136c0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
136d0 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
136e0 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
136f0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
13700 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  rc;.        IOTR
13710 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
13720 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
13730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13740 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
13750 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28  nalHdr + sizeof(
13760 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20  aJournalMagic), 
13770 34 29 29 0a 20 20 20 20 20 20 20 20 72 63 20 3d  4)).        rc =
13780 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
13790 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
137a0 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20  ->nRec);.       
137b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
137c0 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63   rc;..        rc
137d0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
137e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
137f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13800 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13810 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47       }.      PAG
13830 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
13840 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
13850 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
13860 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
13870 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
13880 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 72  pPager)).      r
13890 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
138a0 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
138b0 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
138c0 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
138d0 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  !=0 ) return rc;
138e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
138f0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
13900 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
13910 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
13920 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65  0;..    /* Erase
13930 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
13940 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61  ag from every pa
13950 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ge..    */.    f
13960 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
13970 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
13980 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
13990 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
139a0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
139b0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
139c0 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e  ynced = pPager->
139d0 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66  pFirst;.  }..#if
139e0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
139f0 20 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65   If the Pager.ne
13a00 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63  edSync flag is c
13a10 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67  lear then the Pg
13a20 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a  Hdr.needSync.  *
13a30 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f  * flag must also
13a40 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c   be clear for al
13a50 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79  l pages.  Verify
13a60 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20   that this.  ** 
13a70 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75  invariant is tru
13a80 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a  e..  */.  else{.
13a90 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
13aa0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
13ab0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
13ac0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
13ad0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
13ae0 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  0 );.    }.    a
13af0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
13b00 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61  FirstSynced==pPa
13b10 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20  ger->pFirst );. 
13b20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
13b30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13b40 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73   Merge two lists
13b50 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63   of pages connec
13b60 74 65 64 20 62 79 20 70 44 69 72 74 79 20 61 6e  ted by pDirty an
13b70 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e  d in pgno order.
13b80 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20  .** Do not both 
13b90 66 69 78 69 6e 67 20 74 68 65 20 70 50 72 65 76  fixing the pPrev
13ba0 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a  Dirty pointers..
13bb0 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
13bc0 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28  *merge_pagelist(
13bd0 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72  PgHdr *pA, PgHdr
13be0 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72   *pB){.  PgHdr r
13bf0 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20  esult, *pTail;. 
13c00 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74   pTail = &result
13c10 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26  ;.  while( pA &&
13c20 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70   pB ){.    if( p
13c30 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f  A->pgno<pB->pgno
13c40 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d   ){.      pTail-
13c50 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
13c60 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a      pTail = pA;.
13c70 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70        pA = pA->p
13c80 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65  Dirty;.    }else
13c90 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70  {.      pTail->p
13ca0 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20  Dirty = pB;.    
13cb0 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20    pTail = pB;.  
13cc0 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69      pB = pB->pDi
13cd0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rty;.    }.  }. 
13ce0 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70   if( pA ){.    p
13cf0 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70  Tail->pDirty = p
13d00 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  A;.  }else if( p
13d10 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  B ){.    pTail->
13d20 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d  pDirty = pB;.  }
13d30 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d  else{.    pTail-
13d40 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d  >pDirty = 0;.  }
13d50 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74  .  return result
13d60 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  .pDirty;.}../*.*
13d70 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20  * Sort the list 
13d80 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63 63 65  of pages in acce
13d90 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
13da0 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a  gno.  Pages are.
13db0 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  ** connected by 
13dc0 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e  pDirty pointers.
13dd0 20 20 54 68 65 20 70 50 72 65 76 44 69 72 74 79    The pPrevDirty
13de0 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a   pointers are.**
13df0 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 74 68   corrupted by th
13e00 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66  is sort..*/.#def
13e10 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
13e20 54 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69  T_ALLOC 25.#defi
13e30 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
13e40 20 20 20 20 20 20 20 32 35 0a 23 69 66 64 65 66         25.#ifdef
13e50 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
13e60 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
13e70 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d  _n_sort_bucket =
13e80 20 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53   0;.  #undef N_S
13e90 4f 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65  ORT_BUCKET.  #de
13ea0 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b  fine N_SORT_BUCK
13eb0 45 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33  ET \.   (sqlite3
13ec0 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75  _pager_n_sort_bu
13ed0 63 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67  cket?sqlite3_pag
13ee0 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
13ef0 3a 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41  :N_SORT_BUCKET_A
13f00 4c 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61  LLOC).#endif.sta
13f10 74 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f  tic PgHdr *sort_
13f20 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
13f30 70 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61  pIn){.  PgHdr *a
13f40 5b 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41  [N_SORT_BUCKET_A
13f50 4c 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74  LLOC], *p;.  int
13f60 20 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20   i;.  memset(a, 
13f70 30 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20  0, sizeof(a));. 
13f80 20 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20   while( pIn ){. 
13f90 20 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20     p = pIn;.    
13fa0 70 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b  pIn = p->pDirty;
13fb0 0a 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d  .    p->pDirty =
13fc0 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   0;.    for(i=0;
13fd0 20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54   i<N_SORT_BUCKET
13fe0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
13ff0 69 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20  if( a[i]==0 ){. 
14000 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b         a[i] = p;
14010 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14020 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14030 20 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70       p = merge_p
14040 61 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29  agelist(a[i], p)
14050 3b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d  ;.        a[i] =
14060 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
14070 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53  }.    if( i==N_S
14080 4f 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a  ORT_BUCKET-1 ){.
14090 20 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67        /* Coverag
140a0 65 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20  e: To get here, 
140b0 74 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65  there need to be
140c0 20 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45   2^(N_SORT_BUCKE
140d0 54 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65  T) .      ** ele
140e0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70  ments in the inp
140f0 75 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ut list. This is
14100 20 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69   possible, but i
14110 6d 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20  mpractical..    
14120 20 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69    ** Testing thi
14130 73 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f  s line is the po
14140 69 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61  int of global va
14150 72 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20  riable.      ** 
14160 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
14170 73 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20  sort_bucket..   
14180 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d     */.      a[i]
14190 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73   = merge_pagelis
141a0 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20  t(a[i], p);.    
141b0 7d 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d  }.  }.  p = a[0]
141c0 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e  ;.  for(i=1; i<N
141d0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b  _SORT_BUCKET; i+
141e0 2b 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67  +){.    p = merg
141f0 65 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b  e_pagelist(p, a[
14200 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  i]);.  }.  retur
14210 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
14220 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61  ven a list of pa
14230 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62  ges (connected b
14240 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72  y the PgHdr.pDir
14250 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74  ty pointer) writ
14260 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f  e.** every one o
14270 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75  f those pages ou
14280 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
14290 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20  e file and mark 
142a0 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63  them all.** as c
142b0 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lean..*/.static 
142c0 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
142d0 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
142e0 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
142f0 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  *pPager;.  int r
14300 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  c;..  if( pList=
14310 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
14320 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
14330 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
14340 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
14350 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
14360 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
14370 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
14380 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
14390 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
143a0 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
143b0 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
143c0 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
143d0 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73  owing.  ** calls
143e0 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   to sqlite3OsLoc
143f0 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a  k() are no-ops..
14400 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67    **.  ** Moving
14410 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52   the lock from R
14420 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55  ESERVED to EXCLU
14430 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e  SIVE actually in
14440 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a  volves going.  *
14450 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74  * through an int
14460 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 20  ermediate state 
14470 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e  PENDING.   A PEN
14480 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e  DING lock preven
14490 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64  ts new.  ** read
144a0 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69  ers from attachi
144b0 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ng to the databa
144c0 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66 66  se but is unsuff
144d0 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f  icient for us to
144e0 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68  .  ** write.  Th
144f0 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44  e idea of a PEND
14500 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70  ING lock is to p
14510 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65  revent new reade
14520 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d  rs from.  ** com
14530 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20  ing in while we 
14540 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e  wait for existin
14550 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65  g readers to cle
14560 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  ar..  **.  ** Wh
14570 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69 73  ile the pager is
14580 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45 44   in the RESERVED
14590 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67   state, the orig
145a0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
145b0 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61  le.  ** is uncha
145c0 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20  nged and we can 
145d0 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74  rollback without
145e0 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62   having to playb
145f0 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75  ack the.  ** jou
14600 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72  rnal into the or
14610 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
14620 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74  file.  Once we t
14630 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a  ransition to.  *
14640 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20  * EXCLUSIVE, it 
14650 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
14660 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  se file has been
14670 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79   changed and any
14680 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77   rollback.  ** w
14690 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f  ill require a jo
146a0 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a  urnal playback..
146b0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
146c0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
146d0 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
146e0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
146f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14700 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14710 7d 0a 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72  }..  pList = sor
14720 74 5f 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74  t_pagelist(pList
14730 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73  );.  while( pLis
14740 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
14750 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b   pList->dirty );
14760 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14770 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
14780 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
14790 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
147a0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
147b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
147c0 72 63 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  rc;.    /* If th
147d0 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61  ere are dirty pa
147e0 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20  ges in the page 
147f0 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20  cache with page 
14800 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a  numbers greater.
14810 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65      ** than Page
14820 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d  r.dbSize, this m
14830 65 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65  eans sqlite3Page
14840 72 54 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  rTruncate() was 
14850 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
14860 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
14870 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
14880 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
14890 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
148a0 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
148b0 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
148c0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
148d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
148e0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
148f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ize ){.      cha
14900 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43  r *pData = CODEC
14910 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  2(pPager, PGHDR_
14920 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
14930 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
14940 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
14950 45 33 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E3("STORE %d pag
14960 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
14970 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
14980 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f  >pgno);.      IO
14990 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
149a0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
149b0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pList->pgno));. 
149c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
149d0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
149e0 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
149f0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14a00 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
14a10 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
14a20 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
14a30 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
14a40 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
14a50 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
14a60 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
14a70 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
14a80 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
14a90 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
14aa0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
14ab0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
14ac0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
14ad0 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
14ae0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
14af0 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
14b00 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14b10 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14b20 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
14b30 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
14b40 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14b50 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
14b60 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
14b70 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
14b80 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
14b90 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
14ba0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
14bb0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
14bc0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
14bd0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14be0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
14bf0 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
14c00 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
14c10 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
14c20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
14c30 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
14c40 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
14c50 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
14c60 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
14c70 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
14c80 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
14c90 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
14ca0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
14cb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14cc0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
14cd0 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  ->pDirty;.}../*.
14ce0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
14cf0 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
14d00 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
14d10 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
14d20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
14d30 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
14d40 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
14d50 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
14d60 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
14d70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14d80 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
14d90 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
14da0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
14db0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
14dc0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
14dd0 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
14de0 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
14df0 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
14e00 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
14e10 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
14e20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
14e30 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
14e40 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
14e50 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
14e60 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
14e70 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
14e80 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
14e90 6e 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nal) ){.    retu
14ea0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
14eb0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
14ec0 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
14ed0 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65  r->fd) ){.    re
14ee0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
14ef0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
14f00 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
14f10 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
14f20 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
14f30 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
14f40 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
14f50 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
14f60 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
14f70 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
14f80 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
14f90 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
14fa0 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
14fb0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
14fc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
14fd0 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
14fe0 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
14ff0 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
15000 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
15010 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
15020 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15030 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
15040 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
15050 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
15060 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
15070 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
15080 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
15090 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
150a0 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
150b0 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
150c0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
150d0 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
150e0 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
150f0 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
15100 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
15110 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
15120 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
15130 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
15140 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
15150 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
15160 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
15170 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
15180 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
15190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
151a0 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
151b0 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
151c0 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
151d0 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
151e0 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
151f0 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
15200 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
15210 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
15220 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26  pPager->pFirst &
15230 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d  & syncOk && !MEM
15240 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  DB){.    int rc 
15250 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
15260 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
15270 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
15280 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
15290 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
152a0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
152b0 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
152c0 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ync mode, write 
152d0 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65  a new journal he
152e0 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ader into the.  
152f0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
15300 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
15310 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
15320 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
15330 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61  nal.      ** hea
15340 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
15350 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
15360 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
15370 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  at have.      **
15380 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
15390 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
153a0 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
153b0 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20  he header is.   
153c0 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68     ** trashed wh
153d0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
153e0 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20  d is updated).. 
153f0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
15400 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
15410 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15420 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15430 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73   > 0 );.      as
15440 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
15450 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
15460 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
15470 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
15480 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15490 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
154a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
154b0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
154c0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
154d0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
154e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
154f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
15500 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
15510 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
15520 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
15530 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15540 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
15550 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
15560 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
15570 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
15580 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
15590 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
155a0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
155b0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
155c0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
155d0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
155e0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
155f0 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69  st( pPg );.    i
15600 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15610 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15620 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
15630 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
15640 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
15650 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
15660 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
15670 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
15680 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
15690 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
156a0 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
156b0 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
156c0 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
156d0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
156e0 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  Rollback() optim
156f0 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
15700 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
15710 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
15720 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
15730 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
15740 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
15750 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
15760 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
15770 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
15780 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
15790 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
157a0 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
157b0 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
157c0 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
157d0 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
157e0 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
157f0 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
15800 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
15810 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
15820 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
15830 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
15840 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54  lback ){.    IOT
15850 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f  RACE(("ALWAYS_RO
15860 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50  LLBACK %p\n", pP
15870 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65  ager)).    pPage
15880 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
15890 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 1;.  }..  /*
158a0 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
158b0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
158c0 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
158d0 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  hash table.  */.
158e0 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
158f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
15900 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20  ->pgno==0 );..  
15910 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
15920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
15940 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15950 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
15960 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
15970 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
15980 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
15990 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
159a0 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
159b0 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
159c0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
159d0 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
159e0 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
159f0 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a  teFree()ed..**.*
15a00 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75  * nReq is the nu
15a10 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
15a20 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
15a30 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68  . Once this much
15a40 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c   has.** been rel
15a50 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  eased, the funct
15a60 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e  ion returns. A n
15a70 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f  egative value fo
15a80 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20  r nReq means.** 
15a90 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  free as much mem
15aa0 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  ory as possible.
15ab0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15ac0 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
15ad0 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
15ae0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
15af0 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66  eased..*/.#ifdef
15b00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
15b10 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
15b20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
15b30 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28 69  rReleaseMemory(i
15b40 6e 74 20 6e 52 65 71 29 7b 0a 20 20 63 6f 6e 73  nt nReq){.  cons
15b50 74 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54  t ThreadData *pT
15b60 73 64 72 6f 20 3d 20 73 71 6c 69 74 65 33 54 68  sdro = sqlite3Th
15b70 72 65 61 64 44 61 74 61 52 65 61 64 4f 6e 6c 79  readDataReadOnly
15b80 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61  ();.  int nRelea
15b90 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  sed = 0;.  int i
15ba0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 74  ;..  /* If the t
15bb0 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20  he global mutex 
15bc0 69 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73 75  is held, this su
15bd0 62 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65 73  broutine becomes
15be0 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a 65   a.  ** o-op; ze
15bf0 72 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f  ro bytes of memo
15c00 72 79 20 61 72 65 20 66 72 65 65 64 2e 20 20 54  ry are freed.  T
15c10 68 69 73 20 69 73 20 62 65 63 61 75 73 65 0a 20  his is because. 
15c20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65 20   ** some of the 
15c30 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79 20  code invoked by 
15c40 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  this function ma
15c50 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79 20  y also.  ** try 
15c60 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d 75  to obtain the mu
15c70 74 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20 69  tex, resulting i
15c80 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20  n a deadlock..  
15c90 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
15ca0 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b 0a  OsInMutex(0) ){.
15cb0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
15cc0 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f 73  }..  /* Outermos
15cd0 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72 20  t loop runs for 
15ce0 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65 72  at most two iter
15cf0 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69 74  ations. First it
15d00 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a 20  eration we.  ** 
15d10 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d 6f  try to find memo
15d20 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  ry that can be r
15d30 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74 20  eleased without 
15d40 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 2e  calling fsync().
15d50 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74 65   Second.  ** ite
15d60 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f 6e  ration (which on
15d70 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65 20 66  ly runs if the f
15d80 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20 66  irst failed to f
15d90 72 65 65 20 6e 52 65 71 20 62 79 74 65 73 20 6f  ree nReq bytes o
15da0 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20 69  f.  ** memory) i
15db0 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 63  s permitted to c
15dc0 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68 69  all fsync(). Thi
15dd0 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20 6d  s is of course m
15de0 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20 65  uch more .  ** e
15df0 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a 20  xpensive..  */. 
15e00 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b 20   for(i=0; i<=1; 
15e10 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c 6f  i++){..    /* Lo
15e20 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74  op through all t
15e30 68 65 20 53 51 4c 69 74 65 20 70 61 67 65 72 73  he SQLite pagers
15e40 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 63   opened by the c
15e50 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20 2a  urrent thread. *
15e60 2f 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  /.    Pager *pPa
15e70 67 65 72 20 3d 20 70 54 73 64 72 6f 2d 3e 70 50  ger = pTsdro->pP
15e80 61 67 65 72 3b 0a 20 20 20 20 66 6f 72 28 20 3b  ager;.    for( ;
15e90 20 70 50 61 67 65 72 20 26 26 20 28 6e 52 65 71   pPager && (nReq
15ea0 3c 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c  <0 || nReleased<
15eb0 6e 52 65 71 29 3b 20 70 50 61 67 65 72 3d 70 50  nReq); pPager=pP
15ec0 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ager->pNext){.  
15ed0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
15ee0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
15ef0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
15f00 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  {.        contin
15f10 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ue;.      }..   
15f20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70     /* For each p
15f30 61 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65  ager, try to fre
15f40 65 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20  e as many pages 
15f50 61 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74  as possible (wit
15f60 68 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63  hout .      ** c
15f70 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69  alling fsync() i
15f80 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
15f90 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66  rst iteration of
15fa0 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a   the outermost .
15fb0 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a        ** loop)..
15fc0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77        */.      w
15fd0 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  hile( SQLITE_OK=
15fe0 3d 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63  =(rc = pager_rec
15ff0 79 63 6c 65 28 70 50 61 67 65 72 2c 20 69 2c 20  ycle(pPager, i, 
16000 26 70 50 67 29 29 20 26 26 20 70 50 67 29 20 7b  &pPg)) && pPg) {
16010 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76  .        /* We'v
16020 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74  e found a page t
16030 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20  o free. At this 
16040 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68  point the page h
16050 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20  as been .       
16060 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   ** removed from
16070 20 74 68 65 20 70 61 67 65 20 68 61 73 68 2d 74   the page hash-t
16080 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20  able, free-list 
16090 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20  and synced-list 
160a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69  .        ** (pFi
160b0 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69  rstSynced). It i
160c0 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61  s still in the a
160d0 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20  ll pages (pAll) 
160e0 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
160f0 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * Remove it from
16100 20 74 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72   this list befor
16110 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20  e freeing..     
16120 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
16130 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
16140 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
16150 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
16160 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
16170 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62         ** probab
16180 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20  ly is though..  
16190 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
161a0 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20   PgHdr *pTmp;.  
161b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
161c0 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
161d0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 41   pPg==pPager->pA
161e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
161f0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
16200 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
16210 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
16220 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d          for( pTm
16230 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
16240 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d  pTmp->pNextAll!=
16250 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  pPg; pTmp=pTmp->
16260 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20  pNextAll ){}.   
16270 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65         pTmp->pNe
16280 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  xtAll = pPg->pNe
16290 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  xtAll;.        }
162a0 0a 20 20 20 20 20 20 20 20 6e 52 65 6c 65 61 73  .        nReleas
162b0 65 64 20 2b 3d 20 73 71 6c 69 74 65 41 6c 6c 6f  ed += sqliteAllo
162c0 63 53 69 7a 65 28 70 50 67 29 3b 0a 20 20 20 20  cSize(pPg);.    
162d0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
162e0 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20 70  FREE %p %d\n", p
162f0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
16300 29 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  ));.        PAGE
16310 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
16320 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
16330 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
16340 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
16350 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
16360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16370 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
16380 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
16390 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
163a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
163b0 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
163c0 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
163d0 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
163e0 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
163f0 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
16400 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
16410 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
16420 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
16430 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
16440 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
16450 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
16460 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
16470 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
16480 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
16490 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase .        ** 
164a0 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
164b0 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
164c0 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
164d0 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
164e0 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
164f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
16500 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
16510 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c  IOERR || rc==SQL
16520 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_FULL );.    
16530 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16540 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
16550 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
16560 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
16570 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
16580 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16590 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61  .  return nRelea
165a0 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  sed;.}.#endif /*
165b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
165c0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
165d0 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20   */../*.** Read 
165e0 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70  the content of p
165f0 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74  age pPg out of t
16600 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
16610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16620 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72  readDbPage(Pager
16630 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
16640 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  *pPg, Pgno pgno)
16650 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
16660 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
16670 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16680 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
16690 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
166a0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
166b0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
166c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
166d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
166e0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  d(pPager->fd, PG
166f0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16700 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16710 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
16720 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
16730 20 7d 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28   }.  PAGER_INCR(
16740 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
16750 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
16760 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
16770 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
16780 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
16790 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
167a0 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43  o));.  PAGERTRAC
167b0 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61 67  E3("FETCH %d pag
167c0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
167d0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
167e0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  gno);.  if( pgno
167f0 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==1 ){.    memcp
16800 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
16810 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47  eVers, &((u8*)PG
16820 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16830 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20  )[24],.         
16840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16860 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67       sizeof(pPag
16870 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29  er->dbFileVers))
16880 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70  ;.  }.  CODEC1(p
16890 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
168a0 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e  DATA(pPg), pPg->
168b0 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 72 65 74 75  pgno, 3);.  retu
168c0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
168d0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
168e0 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
168f0 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
16900 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
16910 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
16920 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
16930 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
16940 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
16950 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
16960 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
16970 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
16980 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d   no-op..**.** Im
16990 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
169a0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68  obtaining the sh
169b0 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65  ared lock (if re
169c0 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75  quired), this fu
169d0 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73  nction.** checks
169e0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
169f0 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20  al file. If one 
16a00 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65  is found, an eme
16a10 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a  rgency rollback.
16a20 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ** is performed 
16a30 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
16a40 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16a50 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
16a60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
16a70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16a80 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
16a90 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
16aa0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21  OCK ){.    if( !
16ab0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
16ac0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
16ad0 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
16ae0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
16af0 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
16b00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
16b10 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
16b20 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
16b30 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16b50 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
16b60 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
16b70 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
16b80 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
16b90 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
16ba0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16bb0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
16bc0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
16bd0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
16be0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
16bf0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
16c00 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
16c10 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16c20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
16c30 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
16c40 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
16c50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16c60 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
16c70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
16c80 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
16c90 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
16ca0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
16cb0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
16cc0 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
16cd0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
16ce0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
16cf0 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
16d00 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
16d10 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
16d20 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
16d30 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
16d40 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
16d50 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
16d60 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
16d70 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
16d80 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
16d90 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
16da0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
16db0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
16dc0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
16dd0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
16de0 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
16df0 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
16e00 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
16e10 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
16e20 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
16e30 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
16e40 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
16e50 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
16e60 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
16e70 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
16e80 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
16e90 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
16ea0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
16eb0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
16ec0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16ed0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
16ee0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
16ef0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
16f00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
16f10 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16f20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16f40 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
16f50 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
16f60 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
16f70 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16f80 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
16f90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
16fa0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
16fb0 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
16fc0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
16fd0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
16fe0 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
16ff0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
17000 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
17010 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
17020 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
17030 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
17040 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
17050 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
17060 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
17070 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
17080 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
17090 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
170a0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
170b0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
170c0 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
170d0 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
170e0 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
170f0 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
17100 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
17110 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
17120 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
17130 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
17140 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
17150 20 20 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20      **..** Open 
17160 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
17170 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
17180 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
17190 73 65 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75  se in ..** exclu
171a0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
171b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
171c0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
171d0 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
171e0 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
171f0 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
17200 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
17210 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
17220 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
17230 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
17240 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
17250 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
17260 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
17270 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
17280 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
17290 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
172a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
172b0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
172c0 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
172d0 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
172e0 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
172f0 20 20 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20         int ro;. 
17300 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
17310 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
17320 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
17330 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
17340 65 6e 52 65 61 64 57 72 69 74 65 28 70 50 61 67  enReadWrite(pPag
17350 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
17360 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29  Pager->jfd, &ro)
17370 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
17380 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
17390 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64  K || pPager->jfd
173a0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
173b0 28 20 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  ( ro ){.        
173c0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
173d0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20  BUSY;.          
173e0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
173f0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
17400 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
17420 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17430 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
17440 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72  er_unlock(pPager
17450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
17460 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
17470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17480 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
17490 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
174a0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
174b0 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
174c0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
174d0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
174e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
174f0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
17500 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
17510 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
17520 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  .        /* Play
17530 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
17540 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
17550 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
17560 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a  write.        **
17570 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
17580 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
17590 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  k..        */.  
175a0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
175b0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
175c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
175d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
175e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
175f0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
17600 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
17610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
17620 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
17630 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
17640 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
17650 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
17660 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
17670 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
17680 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
17690 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
176a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
176b0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ll ){.        /*
176c0 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
176d0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
176e0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
176f0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
17700 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
17710 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
17720 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
17730 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
17740 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  s.        ** rea
17750 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
17760 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
17770 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
17780 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
17790 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
177a0 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
177b0 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
177c0 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
177d0 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
177e0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
177f0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
17800 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
17810 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
17820 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
17830 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ng.        ** at
17840 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
17850 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
17860 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
17870 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
17880 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
17890 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
178a0 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
178b0 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
178c0 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  The.        ** o
178d0 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
178e0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
178f0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
17900 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
17910 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
17920 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  se..        ** .
17930 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65          ** There
17940 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
17950 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
17960 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
17970 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
17980 20 20 2a 2a 20 64 65 74 65 63 68 65 64 2e 20 20    ** deteched.  
17990 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
179a0 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
179b0 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
179c0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
179d0 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
179e0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
179f0 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69         char dbFi
17a00 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
17a10 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
17a20 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  )];.        sqli
17a30 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
17a40 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
17a50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17a60 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
17a70 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67       return pPag
17a80 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20  er->errCode;.   
17a90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
17aa0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
17ab0 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
17ac0 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
17ad0 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
17ae0 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
17af0 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
17b00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17b10 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
17b20 66 64 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20  fd, 24);.       
17b30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
17b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
17b50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
17b60 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17b70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17b80 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
17b90 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c  fd, &dbFileVers,
17ba0 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
17bb0 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rs));.          
17bc0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17bd0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
17be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17c00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
17c10 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
17c20 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
17c30 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
17c40 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69      }..        i
17c50 66 28 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72  f( memcmp(pPager
17c60 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62  ->dbFileVers, db
17c70 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66  FileVers, sizeof
17c80 28 64 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30  (dbFileVers))!=0
17c90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
17ca0 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
17cb0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17cc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
17cd0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
17ce0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
17cf0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50  pPager->state<=P
17d00 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
17d10 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
17d20 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
17d30 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
17d40 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
17d50 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
17d60 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
17d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  ;.}../*.** Alloc
17d80 61 74 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65  ate a PgHdr obje
17d90 63 74 2e 20 20 20 45 69 74 68 65 72 20 63 72 65  ct.   Either cre
17da0 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72  ate a new one or
17db0 20 72 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69   reuse.** an exi
17dc0 73 74 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69  sting one that i
17dd0 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20  s not otherwise 
17de0 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  in use..**.** A 
17df0 6e 65 77 20 50 67 48 64 72 20 73 74 72 75 63 74  new PgHdr struct
17e00 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 69  ure is created i
17e10 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
17e20 6c 6f 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72  lowing are.** tr
17e30 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ue:.**.**     (1
17e40 29 20 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65  )  We have not e
17e50 78 63 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69  xceeded our maxi
17e60 6d 75 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61  mum allocated ca
17e70 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20  che size.**     
17e80 20 20 20 20 20 61 73 20 73 65 74 20 62 79 20 74       as set by t
17e90 68 65 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  he "PRAGMA cache
17ea0 5f 73 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a  _size" command..
17eb0 2a 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54  **.**     (2)  T
17ec0 68 65 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73  here are no unus
17ed0 65 64 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  ed PgHdr objects
17ee0 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68   available at th
17ef0 69 73 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  is time..**.**  
17f00 20 20 20 28 33 29 20 20 54 68 69 73 20 69 73 20     (3)  This is 
17f10 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
17f20 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
17f30 20 28 34 29 20 20 54 68 65 72 65 20 61 72 65 20   (4)  There are 
17f40 6e 6f 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73  no PgHdr objects
17f50 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71   that do not req
17f60 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a  uire a journal.*
17f70 2a 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20  *          file 
17f80 73 79 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20  sync and a sync 
17f90 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
17fa0 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ile is currently
17fb0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f  .**          pro
17fc0 68 69 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  hibited..**.** O
17fd0 74 68 65 72 77 69 73 65 2c 20 72 65 75 73 65 20  therwise, reuse 
17fe0 61 6e 20 65 78 69 73 74 69 6e 67 20 50 67 48 64  an existing PgHd
17ff0 72 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  r.  In other wor
18000 64 73 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20  ds, reuse an.** 
18010 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 20 69  existing PgHdr i
18020 66 20 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c  f all of the fol
18030 6c 6f 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a  lowing are true:
18040 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20  .**.**     (1)  
18050 57 65 20 68 61 76 65 20 72 65 61 63 68 65 64 20  We have reached 
18060 6f 72 20 65 78 63 65 65 64 65 64 20 74 68 65 20  or exceeded the 
18070 6d 61 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69  maximum cache si
18080 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61  ze.**          a
18090 6c 6c 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d  llowed by "PRAGM
180a0 41 20 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a  A cache_size"..*
180b0 2a 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68  *.**     (2)  Th
180c0 65 72 65 20 69 73 20 61 20 50 67 48 64 72 20 61  ere is a PgHdr a
180d0 76 61 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67  vailable with Pg
180e0 48 64 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a  Hdr->nRef==0.**.
180f0 2a 2a 20 20 20 20 20 28 33 29 20 20 57 65 20 61  **     (3)  We a
18100 72 65 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d  re not in an in-
18110 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a  memory database.
18120 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45  **.**     (4)  E
18130 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20 61  ither there is a
18140 6e 20 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64  n available PgHd
18150 72 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  r that does not 
18160 6e 65 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  need.**         
18170 20 74 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f   to be synced to
18180 20 64 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69   disk or else di
18190 73 6b 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75  sk syncing is cu
181a0 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20  rrently.**      
181b0 20 20 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a      allowed..*/.
181c0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
181d0 41 6c 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67  AllocatePage(Pag
181e0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64  er *pPager, PgHd
181f0 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74  r **ppPg){.  int
18200 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
18210 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
18220 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
18230 77 20 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f  w PgHdr if any o
18240 66 20 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69  f the four condi
18250 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20  tions defined . 
18260 20 2a 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74   ** above is met
18270 3a 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65  : */.  if( pPage
18280 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
18290 3e 6d 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50  >mxPage.   || pP
182a0 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20  ager->pFirst==0 
182b0 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20  .   || MEMDB.   
182c0 7c 7c 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72  || (pPager->pFir
182d0 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70  stSynced==0 && p
182e0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
182f0 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ).  ){.    if( p
18300 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50  Pager->nPage>=pP
18310 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20  ager->nHash ){. 
18320 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a       pager_resiz
18330 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61  e_hash_table(pPa
18340 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50  ger,.         pP
18350 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20  ager->nHash<256 
18360 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e  ? 256 : pPager->
18370 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20  nHash*2);.      
18380 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  if( pPager->nHas
18390 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
183a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
183b0 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  M;.        goto 
183c0 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f  pager_allocate_o
183d0 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
183e0 7d 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69  }.    pPg = sqli
183f0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
18400 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67  eof(*pPg) + pPag
18410 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20  er->pageSize.   
18420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18430 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
18440 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
18450 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18470 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
18480 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b  of(PgHistory) );
18490 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20  .    if( pPg==0 
184a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
184b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
184c0 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c    goto pager_all
184d0 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d  ocate_out;.    }
184e0 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c  .    memset(pPg,
184f0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
18500 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
18510 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
18520 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
18530 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
18540 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
18550 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ));.    }.    pP
18560 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
18570 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
18580 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
18590 70 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72  pAll;.    pPager
185a0 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20  ->pAll = pPg;.  
185b0 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
185c0 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  +;.  }else{.    
185d0 2f 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78  /* Recycle an ex
185e0 69 73 74 69 6e 67 20 70 61 67 65 20 77 69 74 68  isting page with
185f0 20 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e   a zero ref-coun
18600 74 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  t. */.    rc = p
18610 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
18620 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20  ger, 1, &pPg);. 
18630 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
18640 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
18650 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
18660 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
18670 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18680 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
18690 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
186a0 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
186b0 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
186c0 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
186d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
186e0 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
186f0 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
18700 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
18710 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
18720 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
18730 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
18740 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
18750 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
18760 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
18770 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
18780 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
18790 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
187a0 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
187b0 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
187c0 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
187d0 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
187e0 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
187f0 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
18800 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
18810 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
18820 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
18830 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
18840 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
18850 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
18860 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
18870 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
18880 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
18890 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
188a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
188b0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
188c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
188d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
188e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
188f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18900 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
18910 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
18920 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
18930 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
18940 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
18950 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
18960 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
18970 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
18980 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
18990 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
189a0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
189b0 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
189c0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
189d0 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
189e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
189f0 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
18a00 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
18a10 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
18a20 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
18a30 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
18a40 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
18a50 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
18a60 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
18a70 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
18a80 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
18a90 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
18aa0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
18ab0 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
18ac0 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
18ad0 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
18ae0 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
18af0 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
18b00 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
18b10 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
18b20 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
18b30 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
18b40 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
18b50 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
18b60 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
18b70 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
18b80 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
18b90 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
18ba0 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
18bb0 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
18bc0 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
18bd0 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
18be0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
18bf0 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
18c00 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
18c10 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
18c20 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
18c30 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
18c40 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
18c50 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
18c60 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
18c70 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
18c80 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
18c90 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
18ca0 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
18cb0 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
18cc0 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
18cd0 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
18ce0 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
18cf0 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
18d00 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
18d10 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
18d20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
18d30 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
18d40 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
18d50 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
18d60 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
18d70 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
18d80 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
18d90 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
18da0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
18db0 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
18dc0 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
18dd0 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
18de0 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
18df0 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
18e00 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
18e10 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
18e20 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
18e30 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
18e40 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
18e50 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
18e60 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
18e70 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
18e80 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
18e90 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
18ea0 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
18eb0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
18ec0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
18ed0 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
18ee0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18ef0 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
18f00 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
18f10 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
18f20 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
18f30 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
18f40 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
18f50 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
18f60 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
18f70 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
18f80 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
18f90 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
18fa0 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
18fb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
18fc0 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
18fd0 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
18fe0 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
18ff0 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
19000 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
19010 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
19020 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
19030 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
19040 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
19050 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
19060 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
19070 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
19080 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
19090 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
190a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
190b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
190c0 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
190d0 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
190e0 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
190f0 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
19100 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
19110 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
19120 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
19130 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
19140 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
19150 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
19160 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
19170 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
19180 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
19190 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
191a0 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
191b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
191c0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
191d0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
191e0 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
191f0 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
19200 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
19210 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
19220 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
19230 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
19240 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
19250 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
19260 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
19270 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
19280 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
19290 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
192a0 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
192b0 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
192c0 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
192d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
192e0 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
192f0 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
19300 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
19310 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
19320 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
19330 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
19340 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
19350 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
19360 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
19370 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
19380 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
19390 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
193a0 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  K );..  pPg = pa
193b0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
193c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
193d0 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
193e0 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
193f0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
19400 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
19410 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20  .    int nMax;. 
19420 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41     int h;.    PA
19430 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
19440 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20  >nMiss);.    rc 
19450 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50  = pagerAllocateP
19460 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  age(pPager, &pPg
19470 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
19480 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19490 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
194a0 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e   }..    pPg->pgn
194b0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73  o = pgno;.    as
194c0 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20  sert( !MEMDB || 
194d0 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d  pgno>pPager->stm
194e0 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  tSize );.    if(
194f0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19500 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
19510 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
19520 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
19530 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79  lite3CheckMemory
19540 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
19550 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
19560 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
19570 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
19580 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
19590 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
195a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
195b0 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
195c0 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
195d0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
195e0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
195f0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
19600 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
19610 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
19620 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b  ;.    }..    mak
19630 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
19640 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
19650 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
19660 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
19670 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
19680 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
19690 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
196a0 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
196b0 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
196c0 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
196d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
196e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
196f0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
19700 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
19710 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
19720 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
19730 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
19740 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
19750 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75  Code;.      retu
19760 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
19770 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
19780 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
19790 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
197a0 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
197b0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
197c0 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
197d0 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
197e0 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
197f0 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
19800 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
19810 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
19820 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
19830 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
19840 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
19850 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
19860 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
19870 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
19880 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
19890 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
198a0 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
198b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
198c0 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
198d0 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
198e0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
198f0 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
19900 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
19910 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
19920 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
19930 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
19940 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
19950 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
19960 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19970 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
19980 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
19990 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
199a0 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
199b0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
199c0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
199d0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
199e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
199f0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
19a00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
19a10 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
19a20 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
19a30 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
19a40 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
19a50 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
19a60 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
19a70 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
19a80 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
19a90 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
19aa0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
19ab0 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
19ac0 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
19ad0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
19ae0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
19af0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
19b00 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
19b10 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
19b20 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
19b30 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
19b40 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
19b50 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
19b60 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
19b70 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
19b80 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
19b90 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
19ba0 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
19bb0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
19bc0 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
19bd0 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
19be0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
19bf0 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
19c00 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
19c10 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
19c20 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
19c30 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
19c40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
19c50 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19c60 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
19c70 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
19c80 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
19c90 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19ca0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
19cb0 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
19cc0 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
19cd0 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
19ce0 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
19cf0 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
19d00 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
19d10 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
19d20 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
19d30 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
19d40 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
19d50 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
19d60 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
19d70 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
19d80 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
19d90 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
19da0 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
19db0 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
19dc0 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
19dd0 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
19de0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
19df0 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
19e00 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
19e10 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
19e20 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
19e30 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
19e40 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
19e50 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
19e60 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
19e70 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
19e80 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
19e90 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
19ea0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
19eb0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
19ec0 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
19ed0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
19ee0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19ef0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
19f00 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
19f10 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c   !pPager->pAll |
19f20 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  | pPager->exclus
19f30 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72  iveMode );.    r
19f40 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
19f50 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
19f60 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
19f70 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
19f80 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
19f90 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
19fa0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
19fb0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
19fc0 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
19fd0 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
19fe0 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
19ff0 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1a000 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1a010 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1a020 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1a030 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1a040 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1a050 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1a060 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1a070 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1a080 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1a090 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1a0a0 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1a0b0 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1a0c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1a0d0 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1a0e0 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1a0f0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1a100 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f  Page *pPg){..  /
1a110 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1a120 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1a130 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
1a140 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
1a150 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
1a160 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
1a170 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48  INFO(pPg);..  CH
1a180 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
1a190 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
1a1a0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
1a1b0 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
1a1c0 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
1a1d0 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
1a1e0 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
1a1f0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1a200 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1a210 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1a220 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
1a230 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
1a240 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
1a250 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
1a260 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
1a270 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
1a280 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
1a290 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
1a2a0 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
1a2b0 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
1a2c0 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
1a2d0 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
1a2e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a2f0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
1a300 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1a310 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
1a320 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
1a330 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1a340 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1a350 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
1a360 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
1a370 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
1a380 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
1a390 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1a3a0 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
1a3b0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1a3c0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
1a3d0 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
1a3e0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
1a3f0 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
1a400 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
1a410 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1a420 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
1a430 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
1a440 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a450 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
1a460 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
1a470 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e  =0 && (!pPager->
1a480 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1a490 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a4a0 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  Off>0) ){.      
1a4b0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
1a4c0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1a4d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a4e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a4f0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1a500 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1a510 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
1a520 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
1a530 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
1a540 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
1a550 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1a560 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
1a570 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1a580 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
1a590 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1a5a0 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
1a5b0 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1a5c0 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
1a5d0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
1a5e0 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1a5f0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1a600 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
1a610 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1a620 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1a630 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
1a640 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1a650 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1a660 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1a670 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1a680 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1a690 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a6a0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1a6b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a6c0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1a6d0 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1a6e0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1a6f0 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
1a700 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1a710 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1a720 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1a730 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1a740 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1a750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1a760 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
1a770 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1a780 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1a790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1a7a0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
1a7b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1a7c0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  &pPager->jfd,.  
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a7f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
1a800 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
1a810 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1a820 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50  ger->jfd );.  pP
1a830 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1a840 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1a850 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1a860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a870 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
1a880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1a890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1a8a0 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
1a8b0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1a8c0 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
1a8d0 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  al);.    }.    g
1a8e0 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1a8f0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1a900 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
1a910 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
1a920 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
1a930 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
1a940 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
1a950 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1a960 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
1a970 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
1a980 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
1a990 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
1a9a0 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
1a9b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1a9c0 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
1a9d0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1a9e0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1a9f0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
1aa00 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1aa10 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
1aa20 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1aa30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1aa40 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
1aa50 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1aa60 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
1aa70 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1aa80 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
1aa90 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1aaa0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
1aab0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1aac0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
1aad0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1aae0 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
1aaf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1ab00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1ab10 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
1ab20 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1ab30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1ab40 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
1ab50 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
1ab60 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1ab70 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
1ab80 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ab90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1aba0 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
1abb0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1abc0 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
1abd0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
1abe0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1abf0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
1ac00 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1ac10 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
1ac20 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ac30 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
1ac40 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1ac50 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
1ac60 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
1ac70 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
1ac80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
1ac90 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
1aca0 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1acb0 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
1acc0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1acd0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1ace0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
1acf0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1ad00 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
1ad10 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1ad20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ad30 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
1ad40 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
1ad50 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
1ad60 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
1ad70 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
1ad80 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
1ad90 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
1ada0 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
1adb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
1adc0 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
1add0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
1ade0 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
1adf0 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
1ae00 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1ae10 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1ae20 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
1ae30 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
1ae40 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1ae50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ae60 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
1ae70 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1ae80 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
1ae90 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
1aea0 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
1aeb0 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
1aec0 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
1aed0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1aee0 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
1aef0 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1af00 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
1af10 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
1af20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
1af30 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
1af40 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
1af50 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
1af60 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
1af70 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
1af80 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
1af90 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
1afa0 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
1afb0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1afc0 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1afd0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
1afe0 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
1aff0 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
1b000 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1b010 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
1b020 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
1b030 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
1b040 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1b050 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
1b060 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
1b070 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
1b080 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
1b090 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
1b0a0 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
1b0b0 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
1b0c0 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
1b0d0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1b0e0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
1b0f0 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
1b100 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
1b110 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1b120 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1b130 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b140 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1b150 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
1b160 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1b170 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1b180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1b190 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1b1a0 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
1b1b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1b1c0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
1b1d0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1b1e0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1b1f0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1b200 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1b210 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
1b220 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1b230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1b240 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1b250 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
1b260 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
1b270 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1b280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1b290 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1b2a0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
1b2b0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
1b2c0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
1b2d0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1b2e0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1b2f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1b300 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1b310 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
1b320 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b330 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1b340 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1b350 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1b360 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
1b370 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
1b380 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
1b390 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1b3a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1b3b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1b3c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1b3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b3e0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1b3f0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1b400 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1b410 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1b420 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1b430 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1b440 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1b450 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1b460 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1b470 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1b480 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
1b490 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
1b4a0 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
1b4b0 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
1b4c0 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
1b4d0 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1b4e0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
1b4f0 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
1b500 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b510 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
1b520 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
1b530 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1b540 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
1b550 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1b560 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1b570 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1b580 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1b590 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b5a0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1b5b0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1b5c0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1b5d0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1b5e0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1b5f0 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1b600 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1b610 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1 );.    if( !p
1b620 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b630 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1b640 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1b650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1b660 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1b670 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1b680 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ze;.      rc = w
1b690 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1b6a0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1b6b0 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  }.  assert( !pPa
1b6c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1b6d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1b6e0 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d  nalOff>0 || rc!=
1b6f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
1b700 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b710 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
1b720 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
1b730 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
1b740 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
1b750 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
1b760 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1b770 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
1b780 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1b790 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
1b7a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1b7b0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1b7c0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
1b7d0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
1b7e0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
1b7f0 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
1b800 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
1b810 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1b820 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
1b830 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1b840 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
1b850 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1b860 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
1b870 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1b880 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
1b890 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
1b8a0 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
1b8b0 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
1b8c0 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
1b8d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1b8e0 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
1b8f0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1b900 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
1b910 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1b920 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
1b930 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1b940 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
1b950 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
1b960 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
1b970 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
1b980 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1b990 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69  >pPrevDirty->pDi
1b9a0 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1b9b0 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1b9c0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
1b9d0 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1b9e0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
1b9f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  .}.../*.** Mark 
1ba00 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
1ba10 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
1ba20 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1ba30 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1ba40 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
1ba50 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
1ba60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
1ba70 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
1ba80 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
1ba90 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
1baa0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1bab0 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1bac0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
1bad0 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
1bae0 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
1baf0 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
1bb00 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
1bb10 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1bb20 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
1bb30 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
1bb40 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
1bb50 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1bb60 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
1bb70 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1bb80 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
1bb90 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
1bba0 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
1bbb0 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
1bbc0 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
1bbd0 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
1bbe0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1bbf0 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1bc00 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1bc10 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
1bc20 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
1bc30 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
1bc40 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
1bc50 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1bc60 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
1bc70 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
1bc80 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
1bc90 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
1bca0 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
1bcb0 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
1bcc0 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
1bcd0 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
1bce0 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
1bcf0 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
1bd00 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1bd10 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
1bd20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1bd30 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
1bd40 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
1bd50 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
1bd60 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61  _DATA(pPg);.  Pa
1bd70 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1bd80 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1bd90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1bda0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1bdb0 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
1bdc0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1bdd0 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
1bde0 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1bdf0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1be00 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
1be10 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1be20 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
1be30 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1be40 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
1be50 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1be60 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1be70 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
1be80 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1be90 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1bea0 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
1beb0 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
1bec0 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
1bed0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1bee0 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
1bef0 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
1bf00 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
1bf10 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
1bf20 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1bf30 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
1bf40 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
1bf50 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
1bf60 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
1bf70 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
1bf80 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
1bf90 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
1bfa0 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
1bfb0 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
1bfc0 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
1bfd0 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1bfe0 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
1bff0 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
1c000 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
1c010 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1c020 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
1c030 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1c040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1c050 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1c060 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
1c070 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
1c080 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1c090 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1c0a0 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
1c0b0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
1c0c0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
1c0d0 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
1c0e0 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
1c0f0 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74  nal && (pageInSt
1c100 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20  atement(pPg) || 
1c110 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1c120 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
1c130 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1c140 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1c150 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1c160 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1c170 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1c180 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1c190 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1c1a0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1c1b0 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1c1c0 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1c1d0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1c1e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1c1f0 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1c200 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1c210 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1c220 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1c230 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1c240 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1c250 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1c260 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1c270 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1c280 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1c290 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1c2a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1c2b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c2c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1c2d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c2e0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c2f0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1c300 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1c310 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1c320 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1c330 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1c340 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1c350 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1c360 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1c370 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1c380 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1c390 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1c3a0 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1c3b0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1c3c0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1c3d0 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
1c3e0 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1c3f0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1c400 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1c410 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1c420 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1c430 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1c440 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1c450 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1c460 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1c470 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1c480 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1c490 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1c4a0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1c4b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
1c4c0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1c4d0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1c4e0 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
1c4f0 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
1c500 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1c510 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1c520 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
1c530 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Pg;.        if( 
1c540 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1c550 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1c560 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1c570 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1c580 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1c590 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
1c5a0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1c5b0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c5c0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c5d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1c5e0 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
1c5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1c600 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
1c610 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
1c620 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1c630 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
1c640 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1c650 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1c660 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
1c670 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1c680 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1c690 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1c6a0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1c6b0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
1c6c0 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
1c6d0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1c6e0 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  ta2, *pEnd;.    
1c6f0 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1c700 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1c710 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1c720 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1c730 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1c740 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1c750 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1c760 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1c770 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1c780 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
1c790 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
1c7a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1c7b0 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1c7c0 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1c7d0 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
1c7e0 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1c7f0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1c800 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1c810 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1c820 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1c830 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1c840 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
1c850 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
1c860 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
1c870 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
1c880 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
1c890 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
1c8a0 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1c8b0 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
1c8c0 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
1c8d0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1c8e0 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
1c8f0 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
1c900 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1c910 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c920 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1c930 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1c940 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
1c950 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1c960 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1c970 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1c980 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
1c990 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c9a0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67  journalOff, szPg
1c9b0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  ));.          PA
1c9c0 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1c9d0 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1c9e0 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
1c9f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1ca00 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1ca10 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1ca20 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
1ca30 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1ca40 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
1ca50 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
1ca60 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1ca70 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1ca80 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  c);.          *(
1ca90 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76 65  u32*)pEnd = save
1caa0 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72  d;...  /* An err
1cab0 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20 77  or has occured w
1cac0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
1cad0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
1cae0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 72  .          ** tr
1caf0 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
1cb00 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79  e rolled back by
1cb10 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65   the layer above
1cb20 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  ..          */. 
1cb30 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1cb40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cb50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1cb60 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
1cb70 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ..          pPag
1cb80 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20  er->nRec++;.    
1cb90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1cba0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1cbb0 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
1cbc0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1cbd0 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
1cbe0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1cbf0 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
1cc00 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
1cc10 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b  !pPager->noSync;
1cc20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1cc30 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1cc40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1cc50 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1cc60 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1cc70 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1cc80 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1cc90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
1cca0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67  lse{.        pPg
1ccb0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
1ccc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
1ccd0 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
1cce0 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
1ccf0 20 50 41 47 45 52 54 52 41 43 45 34 28 22 41 50   PAGERTRACE4("AP
1cd00 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
1cd10 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
1cd20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd30 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1cd40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1cd50 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
1cd60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
1cd70 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
1cd80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1cd90 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1cda0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
1cdb0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1cdc0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
1cdd0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
1cde0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
1cdf0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
1ce00 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
1ce10 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
1ce20 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
1ce30 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1ce40 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
1ce50 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
1ce60 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
1ce70 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
1ce80 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
1ce90 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
1cea0 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
1ceb0 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
1cec0 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
1ced0 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
1cee0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1cef0 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26 26 20  tInUse .     && 
1cf00 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
1cf10 28 70 50 67 29 20 0a 20 20 20 20 20 26 26 20 28  (pPg) .     && (
1cf20 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
1cf30 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1cf40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73  .    ){.      as
1cf50 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1cf60 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1cf70 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1cf80 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1cf90 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1cfa0 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1cfb0 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1cfc0 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1cfd0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
1cfe0 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
1cff0 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
1d000 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
1d010 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
1d020 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
1d030 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
1d040 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
1d050 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
1d060 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
1d070 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1d080 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1d090 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
1d0a0 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  }.        PAGERT
1d0b0 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52  RACE3("STMT-JOUR
1d0c0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e  NAL %d page %d\n
1d0d0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
1d0e0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
1d0f0 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
1d100 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1d110 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  g);.      }else{
1d120 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
1d130 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
1d140 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
1d150 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20  g->pgno, 7)-4;. 
1d160 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73         put32bits
1d170 28 70 44 61 74 61 32 2c 20 70 50 67 2d 3e 70 67  (pData2, pPg->pg
1d180 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  no);.        rc 
1d190 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1d1a0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
1d1b0 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
1d1c0 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
1d1d0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
1d1e0 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64  "STMT-JOURNAL %d
1d1f0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1d200 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1d210 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1d220 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d230 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1d240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1d250 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1d260 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
1d270 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1d280 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1d290 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
1d2a0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1d2b0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1d2c0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1d2d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1d2e0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
1d2f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
1d300 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
1d310 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
1d320 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1d330 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
1d340 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1d350 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
1d360 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1d370 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
1d380 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
1d390 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
1d3a0 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
1d3b0 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
1d3c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
1d3d0 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
1d3e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1d3f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1d400 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d410 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
1d420 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
1d430 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
1d440 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
1d450 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
1d460 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
1d470 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
1d480 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
1d490 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
1d4a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
1d4b0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
1d4c0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1d4d0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
1d4e0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
1d4f0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
1d500 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
1d510 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
1d520 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
1d530 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
1d540 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
1d550 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
1d560 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
1d570 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
1d580 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
1d590 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1d5a0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
1d5b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1d5c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1d5d0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
1d5e0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
1d5f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d600 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
1d610 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
1d620 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1d630 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
1d640 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
1d650 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
1d660 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
1d670 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21  eSize);..  if( !
1d680 4d 45 4d 44 42 20 26 26 20 6e 50 61 67 65 50 65  MEMDB && nPagePe
1d690 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20  rSector>1 ){.   
1d6a0 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74   Pgno nPageCount
1d6b0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  ;          /* To
1d6c0 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
1d6d0 67 65 73 20 69 6e 20 64 61 74 61 62 61 73 65 20  ges in database 
1d6e0 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f  file */.    Pgno
1d6f0 20 70 67 31 3b 20 20 20 20 20 20 20 20 20 20 20   pg1;           
1d700 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 70        /* First p
1d710 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1d720 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1d730 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20   on. */.    int 
1d740 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1d750 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1d760 6f 66 20 70 61 67 65 73 20 73 74 61 72 74 69 6e  of pages startin
1d770 67 20 61 74 20 70 67 31 20 74 6f 20 6a 6f 75 72  g at pg1 to jour
1d780 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  nal */.    int i
1d790 69 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74  i;..    /* Set t
1d7a0 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61  he doNotSync fla
1d7b0 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20  g to 1. This is 
1d7c0 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f  because we canno
1d7d0 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61  t allow a journa
1d7e0 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20  l.    ** header 
1d7f0 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 65  to be written be
1d800 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73 20  tween the pages 
1d810 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69  journaled by thi
1d820 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
1d830 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
1d840 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1d850 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1d860 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
1d870 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
1d880 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
1d890 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
1d8a0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
1d8b0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
1d8c0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
1d8d0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
1d8e0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
1d8f0 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
1d900 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
1d910 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
1d920 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
1d930 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
1d940 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
1d950 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
1d960 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
1d970 20 31 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f   1;..    nPageCo
1d980 75 6e 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  unt = sqlite3Pag
1d990 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1d9a0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  er);.    if( pPg
1d9b0 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e  ->pgno>nPageCoun
1d9c0 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65  t ){.      nPage
1d9d0 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20   = (pPg->pgno - 
1d9e0 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73  pg1)+1;.    }els
1d9f0 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65  e if( (pg1+nPage
1da00 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61  PerSector-1)>nPa
1da10 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1da20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f   nPage = nPageCo
1da30 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d  unt+1-pg1;.    }
1da40 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
1da50 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74  e = nPagePerSect
1da60 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  or;.    }.    as
1da70 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20  sert(nPage>0);. 
1da80 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70     assert(pg1<=p
1da90 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
1daa0 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65  ssert((pg1+nPage
1dab0 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  )>pPg->pgno);.. 
1dac0 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
1dad0 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c  nPage && rc==SQL
1dae0 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20  ITE_OK; ii++){. 
1daf0 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70       Pgno pg = p
1db00 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 69 66 28  g1+ii;.      if(
1db10 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   !pPager->aInJou
1db20 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d  rnal || pg==pPg-
1db30 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20  >pgno || .      
1db40 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f      pg>pPager->o
1db50 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21 28 70  rigDbSize || !(p
1db60 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1db70 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26  l[pg/8]&(1<<(pg&
1db80 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b 0a 20  7))).      ) {. 
1db90 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
1dba0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1dbb0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
1dbc0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 0a    PgHdr *pPage;.
1dbd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1dbe0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
1dbf0 50 61 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67  Pager, pg, &pPag
1dc00 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1dc10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1dc20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1dc30 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1dc40 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1dc50 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1dc60 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
1dc70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1dc80 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1dc90 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1dca0 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1dcb0 3d 3d 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==1 );.    pPage
1dcc0 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30  r->doNotSync = 0
1dcd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1dce0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28  c = pager_write(
1dcf0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
1dd00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1dd10 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1dd20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
1dd30 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
1dd40 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
1dd50 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
1dd60 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1dd70 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
1dd80 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
1dd90 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
1dda0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
1ddb0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1ddc0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
1ddd0 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
1dde0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
1ddf0 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
1de00 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
1de10 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
1de20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1de30 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65  _VACUUM./*.** Re
1de40 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
1de50 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
1de60 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
1de70 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
1de80 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
1de90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1dea0 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50  PagerOverwrite(P
1deb0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
1dec0 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
1ded0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
1dee0 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
1def0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1df00 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
1df10 67 6e 6f 2c 20 26 70 50 67 29 3b 0a 20 20 69 66  gno, &pPg);.  if
1df20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1df30 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
1df40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1df50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
1df60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1df70 20 20 20 6d 65 6d 63 70 79 28 73 71 6c 69 74 65     memcpy(sqlite
1df80 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
1df90 67 29 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65  g), pData, pPage
1dfa0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1dfb0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50    }.    sqlite3P
1dfc0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1dfd0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1dfe0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1dff0 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20   A call to this 
1e000 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68  routine tells th
1e010 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74 20  e pager that it 
1e020 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1e030 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65   to.** write the
1e040 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20   information on 
1e050 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74 6f  page pPg back to
1e060 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
1e070 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
1e080 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
1e090 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
1e0a0 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
1e0b0 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
1e0c0 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1e0d0 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
1e0e0 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
1e0f0 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
1e100 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
1e110 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
1e120 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
1e130 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
1e140 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
1e150 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
1e160 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
1e170 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
1e180 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
1e190 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
1e1a0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1e1b0 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
1e1c0 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
1e1d0 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
1e1e0 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
1e1f0 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
1e200 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
1e210 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
1e220 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
1e230 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
1e240 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
1e250 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
1e260 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
1e270 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
1e280 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1e290 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
1e2a0 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
1e2b0 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
1e2c0 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
1e2d0 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
1e2e0 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
1e2f0 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
1e300 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
1e310 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
1e320 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
1e330 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
1e340 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
1e350 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
1e360 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
1e370 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
1e380 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
1e390 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
1e3a0 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1e3b0 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
1e3c0 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
1e3d0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
1e3e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1e3f0 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
1e400 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c  used,.** the sql
1e410 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1e420 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
1e430 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
1e440 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 70  because the.** p
1e450 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72 69  age contains cri
1e460 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
1e470 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
1e480 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a 20  sure it gets.** 
1e490 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
1e4a0 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c 69  pite of the sqli
1e4b0 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c  te3PagerDontRoll
1e4c0 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a  back() call..*/.
1e4d0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1e4e0 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61 67  rDontWrite(DbPag
1e4f0 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 50  e *pDbPage){.  P
1e500 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1e510 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1e520 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1e530 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  er;..  if( MEMDB
1e540 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 50 67   ) return;.  pPg
1e550 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1e560 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d   = 1;.  if( pPg-
1e570 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67 65  >dirty && !pPage
1e580 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1e590 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1e5a0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1e5b0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1e5c0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
1e5d0 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
1e5e0 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
1e5f0 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
1e600 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
1e610 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
1e620 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
1e630 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
1e640 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
1e650 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
1e660 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
1e670 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
1e680 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
1e690 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
1e6a0 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
1e6b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1e6c0 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
1e6d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
1e6e0 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
1e6f0 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
1e700 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
1e710 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
1e720 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
1e730 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
1e740 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
1e750 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
1e760 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
1e770 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
1e780 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
1e790 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
1e7a0 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
1e7b0 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
1e7c0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1e7d0 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
1e7e0 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
1e7f0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
1e800 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
1e810 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1e820 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
1e830 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
1e840 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
1e850 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
1e860 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41    IOTRACE(("CLEA
1e870 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  N %p %d\n", pPag
1e880 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a  er, pPg->pgno)).
1e890 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
1e8a0 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
1e8b0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1e8c0 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
1e8d0 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1e8e0 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1e8f0 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
1e900 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1e910 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1e920 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1e930 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
1e940 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
1e950 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1e960 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1e970 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
1e980 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
1e990 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1e9a0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
1e9b0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
1e9c0 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
1e9d0 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
1e9e0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
1e9f0 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
1ea00 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
1ea10 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
1ea20 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
1ea30 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
1ea40 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
1ea50 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
1ea60 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
1ea70 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
1ea80 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
1ea90 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
1eaa0 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
1eab0 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
1eac0 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
1ead0 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
1eae0 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
1eaf0 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
1eb00 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
1eb10 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
1eb20 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1eb30 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72  pPager;..  asser
1eb40 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1eb50 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1eb60 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1eb70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1eb80 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1eb90 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1eba0 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
1ebb0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1ebc0 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  | MEMDB ) return
1ebd0 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  ;.  if( !pPg->in
1ebe0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1ebf0 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1ec00 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1ec10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ec20 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ec30 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l!=0 );.    pPag
1ec40 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1ec50 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1ec60 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1ec70 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
1ec80 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  nal = 1;.    pPg
1ec90 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1eca0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1ecb0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1ecc0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1ecd0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1ece0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1ecf0 26 37 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50  &7);.    }.    P
1ed00 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
1ed10 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
1ed20 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1ed30 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1ed40 50 61 67 65 72 29 29 3b 0a 20 20 20 20 49 4f 54  Pager));.    IOT
1ed50 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
1ed60 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1ed70 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d   pPg->pgno)).  }
1ed80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1ed90 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 26 26 20  tmtInUse .   && 
1eda0 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65 6e 74  !pageInStatement
1edb0 28 70 50 67 29 20 0a 20 20 20 26 26 20 28 69 6e  (pPg) .   && (in
1edc0 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61  t)pPg->pgno<=pPa
1edd0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20  ger->stmtSize . 
1ede0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1edf0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
1ee00 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
1ee10 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
1ee20 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
1ee30 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
1ee40 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  mt!=0 );.    pPa
1ee50 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1ee60 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1ee70 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1ee80 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
1ee90 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1eea0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
1eeb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1eec0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
1eed0 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
1eee0 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
1eef0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
1ef00 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
1ef10 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1ef20 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
1ef30 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
1ef40 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1ef50 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1ef60 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
1ef70 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1ef80 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  ne ){.    /* Ope
1ef90 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
1efa0 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
1efb0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1efc0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1efd0 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
1efe0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1eff0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f000 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
1f010 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f020 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  (pPgHdr);.    if
1f030 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f040 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a  ) return rc;.  .
1f050 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1f060 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1f070 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1f080 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1f090 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
1f0a0 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 20 20  (pPgHdr, 24);.  
1f0b0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1f0c0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1f0d0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1f0e0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1f0f0 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
1f100 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
1f110 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1f120 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
1f130 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
1f140 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1f150 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65   .    /* Release
1f160 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
1f170 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  nce. */.    sqli
1f180 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
1f190 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67 65  gHdr);.    pPage
1f1a0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1f1b0 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  ne = 1;.  }.  re
1f1c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f1d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
1f1e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1f1f0 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
1f200 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
1f210 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
1f220 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
1f230 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1f240 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1f250 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
1f260 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
1f270 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
1f280 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
1f290 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
1f2a0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
1f2b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
1f2c0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1f2d0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1f2e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
1f2f0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
1f300 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
1f310 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
1f320 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
1f330 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f340 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
1f350 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
1f360 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
1f370 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
1f380 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
1f390 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
1f3a0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1f3b0 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
1f3c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1f3d0 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
1f3e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1f3f0 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
1f400 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
1f410 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
1f420 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
1f430 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
1f440 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
1f450 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a  haseOne() call..
1f460 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1f470 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
1f480 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
1f490 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
1f4a0 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
1f4b0 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
1f4c0 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
1f4d0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1f4e0 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
1f4f0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
1f500 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50 61  seOne(Pager *pPa
1f510 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
1f520 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
1f530 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
1f540 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1f550 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44 41   PAGERTRACE4("DA
1f560 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
1f570 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
1f580 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
1f590 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
1f5a0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
1f5b0 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20   nTrunc);..  /* 
1f5c0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
1f5d0 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
1f5e0 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
1f5f0 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
1f600 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1f610 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1f620 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
1f630 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1f640 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1f650 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
1f660 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
1f670 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1f680 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
1f690 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
1f6a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1f6b0 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a  lOpen );..    /*
1f6c0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1f6d0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
1f6e0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1f6f0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
1f700 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1f710 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
1f720 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
1f730 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1f740 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
1f750 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
1f760 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
1f770 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
1f780 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
1f790 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1f7a0 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
1f7b0 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
1f7c0 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
1f7d0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
1f7e0 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
1f7f0 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
1f800 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1f810 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1f820 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1f830 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
1f840 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1f850 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1f860 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1f870 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1f880 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23  oto sync_exit;.#
1f890 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f8a0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f8b0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1f8c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1f8d0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1f8e0 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1f8f0 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1f900 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1f910 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69  s.        ** bei
1f920 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
1f930 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
1f940 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
1f950 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
1f960 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
1f970 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1f980 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
1f990 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
1f9a0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
1f9b0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  er);.        for
1f9c0 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
1f9d0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1f9e0 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
1f9f0 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61 67        if( !(pPag
1fa00 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69  er->aInJournal[i
1fa10 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29 29  /8] & (1<<(i&7))
1fa20 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b  ) && i!=iSkip ){
1fa30 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1fa40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1fa50 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1fa60 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
1fa70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1fa80 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1fa90 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1faa0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fab0 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20  rWrite(pPg);.   
1fac0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1fad0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1fae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1faf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fb00 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fb10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1fb20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a       } .      }.
1fb30 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
1fb40 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
1fb50 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
1fb60 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
1fb70 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fb80 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fb90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
1fba0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1fbb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1fbc0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1fbd0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1fbe0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1fbf0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1fc00 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21  .    if( nTrunc!
1fc10 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1fc20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
1fc30 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1fc40 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
1fc50 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1fc60 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1fc70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1fc80 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
1fc90 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
1fca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1fcb0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
1fcc0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1fcd0 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1fce0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1fcf0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1fd00 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1fd10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1fd20 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1fd30 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1fd40 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e  = 0;..    /* Syn
1fd50 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1fd60 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
1fd70 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
1fd80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1fd90 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1fda0 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20  er->fd, 0);.    
1fdb0 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
1fdc0 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
1fdd0 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67  ager))..    pPag
1fde0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1fdf0 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73  R_SYNCED;.  }els
1fe00 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e  e if( MEMDB && n
1fe10 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1fe20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fe30 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
1fe40 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a  , nTrunc);.  }..
1fe50 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74  sync_exit:.  ret
1fe60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1fe70 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61  * Commit all cha
1fe80 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
1fe90 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65  base and release
1fea0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e   the write lock.
1feb0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f  .**.** If the co
1fec0 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61  mmit fails for a
1fed0 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c  ny reason, a rol
1fee0 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73  lback attempt is
1fef0 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20   made.** and an 
1ff00 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1ff10 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20  turned.  If the 
1ff20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53  commit worked, S
1ff30 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
1ff40 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
1ff50 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1ff60 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65 72  itPhaseTwo(Pager
1ff70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
1ff80 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
1ff90 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
1ffa0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
1ffb0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1ffc0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
1ffd0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1ffe0 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
1fff0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
20000 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
20010 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
20020 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
20030 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
20040 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
20050 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
20060 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
20070 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
20080 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
20090 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
200a0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
200b0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
200c0 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  ;.      clearHis
200d0 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
200e0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
200f0 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
20100 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
20110 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
20120 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
20130 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
20140 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
20150 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
20160 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
20170 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 70      pPg = pPg->p
20180 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20  Dirty;.    }.   
20190 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
201a0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  = 0;.#ifndef NDE
201b0 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
201c0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
201d0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
201e0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
201f0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
20200 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
20210 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
20220 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
20230 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
20240 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
20250 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
20260 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
20270 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
20280 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
20290 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
202a0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
202b0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
202c0 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
202d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
202e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
202f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
20300 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
20310 61 63 68 65 20 29 3b 0a 20 20 61 73 73 65 72 74  ache );.  assert
20320 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
20330 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c 7c  =PAGER_SYNCED ||
20340 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43   !pPager->dirtyC
20350 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d 20 70  ache );.  rc = p
20360 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
20370 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
20380 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
20390 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
203a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
203b0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
203c0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
203d0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
203e0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
203f0 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
20400 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
20410 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
20420 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
20430 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
20440 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
20450 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
20460 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
20470 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
20480 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
20490 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
204a0 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
204b0 72 6f 74 6f 63 6f 6c 20 6f 72 20 75 6e 6c 65 73  rotocol or unles
204c0 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
204d0 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
204e0 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
204f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
20500 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
20510 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
20520 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
20530 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
20540 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
20550 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
20560 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
20570 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
20580 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
20590 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
205a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
205b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
205c0 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
205d0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
205e0 63 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  c;.  PAGERTRACE2
205f0 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
20600 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
20610 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
20620 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
20630 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
20640 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
20650 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
20660 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
20670 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
20680 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
20690 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
206a0 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
206b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
206c0 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
206d0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
206e0 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
206f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20700 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
20710 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
20720 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
20730 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
20740 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
20750 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
20760 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
20770 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
20780 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
20790 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
207a0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
207b0 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
207c0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
207d0 65 29 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  e);.        PAGE
207e0 52 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41 43  RTRACE3("ROLLBAC
207f0 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64 5c  K-PAGE %d of %d\
20800 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
20810 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
20820 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20830 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
20840 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
20850 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
20860 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
20870 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
20880 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
20890 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
208a0 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
208b0 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
208c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
208d0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
208e0 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65       pHist->pPre
208f0 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70  vStmt = pHist->p
20900 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
20910 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
20920 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
20930 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
20940 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
20950 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
20960 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
20970 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
20980 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
20990 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
209a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
209b0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
209c0 65 3b 0a 20 20 20 20 70 61 67 65 72 5f 74 72 75  e;.    pager_tru
209d0 6e 63 61 74 65 5f 63 61 63 68 65 28 70 50 61 67  ncate_cache(pPag
209e0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
209f0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
20a00 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20a10 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
20a20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
20a30 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
20a40 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
20a50 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
20a60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
20a70 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
20a80 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
20a90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
20aa0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
20ab0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
20ac0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
20ad0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
20ae0 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
20af0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
20b00 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
20b10 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
20b20 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
20b30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
20b40 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
20b50 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  de;.  }.  if( pP
20b60 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
20b70 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
20b80 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20     int rc2;.    
20b90 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
20ba0 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
20bb0 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
20bc0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
20bd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
20be0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
20bf0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
20c00 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
20c10 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
20c20 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
20c30 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61   0);.  }.  /* pa
20c40 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
20c50 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  ); */.  pPager->
20c60 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20  dbSize = -1;..  
20c70 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
20c80 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52  ccurs during a R
20c90 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20  OLLBACK, we can 
20ca0 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20  no longer trust 
20cb0 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63  the pager.  ** c
20cc0 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
20cd0 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
20ce0 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
20cf0 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
20d00 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
20d10 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70 61 67   */.  return pag
20d20 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
20d30 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   rc);.}../*.** R
20d40 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
20d50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20d60 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
20d70 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
20d80 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
20d90 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
20da0 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
20db0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20dc0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
20dd0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
20de0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
20df0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
20e00 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
20e10 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
20e20 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
20e30 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
20e40 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
20e50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
20e60 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  urn pPager->nRef
20e70 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
20e80 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
20e90 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
20ea0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
20eb0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
20ec0 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
20ed0 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
20ee0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
20ef0 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
20f00 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
20f10 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
20f20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
20f30 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
20f40 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
20f50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20f60 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
20f70 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
20f80 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
20f90 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  e;.  a[6] = pPag
20fa0 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
20fb0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
20fc0 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f  ;.  a[8] = 0;  /
20fd0 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61  * Used to be pPa
20fe0 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20  ger->nOvfl */.  
20ff0 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[9] = pPager->n
21000 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20  Read;.  a[10] = 
21010 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a  pPager->nWrite;.
21020 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65    return a;.}.#e
21030 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
21040 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  the statement ro
21050 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a  llback point..**
21060 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
21070 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
21080 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73  d with the trans
21090 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61  action journal a
210a0 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20  lready.** open. 
210b0 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   A new statement
210c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61   journal is crea
210d0 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20  ted that can be 
210e0 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  used to rollback
210f0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61  .** changes of a
21100 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
21110 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72  and within a lar
21120 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ger transaction.
21130 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21140 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61  agerStmtBegin(Pa
21150 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21160 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
21170 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  ( !pPager->stmtI
21180 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74  nUse );.  assert
21190 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
211a0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
211b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
211c0 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a  r->dbSize>=0 );.
211d0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
211e0 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
211f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
21200 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
21210 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
21220 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
21230 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
21240 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
21250 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
21260 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
21270 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
21280 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
21290 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
212a0 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
212b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
212c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
212d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
212e0 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  n );.  pPager->a
212f0 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  InStmt = sqliteM
21300 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
21310 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
21320 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
21330 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  Stmt==0 ){.    /
21340 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  * sqlite3OsLock(
21350 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52  pPager->fd, SHAR
21360 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20  ED_LOCK); */.   
21370 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
21380 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65  OMEM;.  }.#ifnde
21390 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20  f NDEBUG.  rc = 
213a0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
213b0 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  e(pPager->jfd, &
213c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
213d0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
213e0 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
213f0 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
21400 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
21410 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ze == pPager->jo
21420 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64  urnalOff );.#end
21430 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  if.  pPager->stm
21440 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
21450 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
21460 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
21470 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
21480 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
21490 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
214a0 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
214b0 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
214c0 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
214d0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
214e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
214f0 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 70  PagerOpentemp(&p
21500 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
21510 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
21520 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
21530 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  d;.    pPager->s
21540 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
21550 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
21560 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
21570 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
21580 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
21590 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
215a0 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
215b0 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
215c0 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
215d0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
215e0 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65  Stmt);.    pPage
215f0 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->aInStmt = 0;.
21600 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
21620 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
21630 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21640 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65  rStmtCommit(Page
21650 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
21660 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
21670 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  Use ){.    PgHdr
21680 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
21690 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22     PAGERTRACE2("
216a0 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
216b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
216c0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
216d0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
216e0 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
216f0 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
21700 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
21710 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
21720 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  stfd, 0); */.   
21730 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
21740 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
21750 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
21760 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  aInStmt = 0;.   
21770 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
21780 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
21790 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
217a0 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
217b0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
217c0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
217d0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
217e0 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
217f0 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
21800 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
21810 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
21820 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
21830 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
21840 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
21850 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
21860 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
21870 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
21880 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
21890 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
218a0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
218b0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
218c0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
218d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
218e0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
218f0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
21900 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
21910 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
21920 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21930 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
21940 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
21950 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
21960 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c  te3PagerStmtRoll
21970 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
21980 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
21990 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
219a0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41  tInUse ){.    PA
219b0 47 45 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d  GERTRACE2("STMT-
219c0 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
219d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
219e0 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
219f0 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
21a00 70 50 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73  pPg;.      PgHis
21a10 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
21a20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
21a30 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
21a40 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53  Pg=pHist->pNextS
21a50 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48  tmt){.        pH
21a60 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
21a70 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
21a80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48  ;.        if( pH
21a90 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ist->pStmt ){.  
21aa0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
21ab0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
21ac0 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  ), pHist->pStmt,
21ad0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
21ae0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  e);.          sq
21af0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
21b00 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
21b10 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
21b20 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
21b30 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
21b40 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
21b50 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
21b60 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
21b70 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
21b80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
21b90 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
21ba0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
21bb0 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
21bc0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
21bd0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
21be0 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
21bf0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
21c00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
21c10 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
21c20 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
21c30 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
21c40 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
21c50 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
21c60 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21c70 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
21c80 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61   char *sqlite3Pa
21c90 67 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65  gerFilename(Page
21ca0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
21cb0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
21cc0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
21cd0 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
21ce0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
21cf0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
21d00 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
21d10 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50  e3PagerDirname(P
21d20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
21d30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
21d40 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
21d50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21d60 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
21d70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
21d80 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
21d90 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f   *sqlite3PagerJo
21da0 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20  urnalname(Pager 
21db0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
21dc0 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  rn pPager->zJour
21dd0 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nal;.}../*.** Re
21de0 74 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79  turn true if fsy
21df0 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64  nc() calls are d
21e00 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73  isabled for this
21e10 20 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20   pager.  Return 
21e20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e  FALSE.** if fsyn
21e30 63 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65  c()s are execute
21e40 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69  d normally..*/.i
21e50 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e  nt sqlite3PagerN
21e60 6f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  osync(Pager *pPa
21e70 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
21e80 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d  Pager->noSync;.}
21e90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
21ea0 48 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20  HAS_CODEC./*.** 
21eb0 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
21ec0 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
21ed0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21ee0 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
21ef0 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
21f00 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
21f10 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
21f20 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
21f30 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
21f40 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
21f50 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
21f60 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
21f70 63 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  cArg;.}.#endif..
21f80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21f90 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
21fa0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
21fb0 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
21fc0 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
21fd0 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
21fe0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
21ff0 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
22000 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
22010 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
22020 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
22030 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
22040 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
22050 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
22060 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
22070 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
22080 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
22090 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
220a0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
220b0 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
220c0 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
220d0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
220e0 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
220f0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
22100 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
22110 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
22120 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
22130 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
22140 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
22150 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
22160 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
22170 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
22180 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
22190 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
221a0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
221b0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
221c0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
221d0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
221e0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
221f0 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
22200 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
22210 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
22220 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
22230 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
22240 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
22250 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
22260 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
22270 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
22280 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
22290 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
222a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
222b0 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e  s active)..*/.in
222c0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f  t sqlite3PagerMo
222d0 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  vepage(Pager *pP
222e0 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50  ager, DbPage *pP
222f0 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
22300 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
22310 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
22320 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
22330 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
22340 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
22350 50 41 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56  PAGERTRACE5("MOV
22360 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e 65  E %d page %d (ne
22370 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73  edSync=%d) moves
22380 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20   to %d\n", .    
22390 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
223a0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
223b0 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e  g->needSync, pgn
223c0 6f 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  o);.  IOTRACE(("
223d0 4d 4f 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22  MOVE %p %d %d\n"
223e0 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
223f0 67 6e 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70  gno, pgno))..  p
22400 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
22410 28 70 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67  (pPg);.  if( pPg
22420 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
22430 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
22440 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
22450 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
22460 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
22470 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
22480 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
22490 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
224a0 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   );.  }..  /* Un
224b0 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
224c0 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  's hash-chain */
224d0 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
224e0 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
224f0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
22500 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
22510 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
22520 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
22530 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
22540 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
22550 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
22560 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
22570 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
22580 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
22590 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
225a0 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
225b0 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
225c0 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
225d0 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
225e0 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  /.  pPgOld = pag
225f0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
22600 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
22610 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73  PgOld ){.    ass
22620 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  ert( pPgOld->nRe
22630 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69  f==0 );.    unli
22640 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
22650 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20  er, pPgOld);.   
22660 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c   makeClean(pPgOl
22670 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f  d);.    if( pPgO
22680 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ld->needSync ){.
22690 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
226a0 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gOld->inJournal 
226b0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
226c0 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
226d0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
226e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   = 1;.      asse
226f0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
22700 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Sync );.    }.  
22710 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  }..  /* Change t
22720 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
22730 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
22740 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
22750 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
22760 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
22770 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
22780 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
22790 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
227a0 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
227b0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
227c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
227d0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
227e0 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
227f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
22800 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
22810 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
22820 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
22830 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
22840 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
22850 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
22860 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
22870 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
22880 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
22890 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
228a0 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
228b0 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
228c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
228d0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
228e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
228f0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
22900 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
22910 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
22920 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
22930 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
22940 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
22950 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
22960 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
22970 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
22980 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
22990 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75   ** Pager.aInJou
229a0 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65  rnal bit has bee
229b0 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
229c0 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
229d0 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20   by loading.    
229e0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ** the page into
229f0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
22a00 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
22a10 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
22a20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
22a30 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
22a40 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
22a50 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
22a60 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
22a70 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
22a80 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
22a90 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
22aa0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
22ab0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
22ac0 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
22ad0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22ae0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
22af0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
22b00 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
22b10 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
22b20 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
22b30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
22b40 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
22b50 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
22b60 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65  ;.    pPgHdr->ne
22b70 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
22b80 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgHdr->inJourna
22b90 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
22ba0 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
22bb0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
22bc0 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
22bd0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
22be0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
22bf0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
22c00 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
22c10 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
22c20 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
22c30 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
22c40 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
22c50 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50  pPg){.  return P
22c60 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
22c70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
22c80 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22c90 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
22ca0 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
22cb0 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
22cc0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
22cd0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
22ce0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
22cf0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
22d00 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
22d10 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
22d20 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
22d30 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
22d40 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  ?PGHDR_TO_EXTRA(
22d50 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b  pPg, pPager):0);
22d60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
22d70 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
22d80 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
22d90 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
22da0 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
22db0 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
22dc0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
22dd0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22de0 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
22df0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22e00 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
22e10 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
22e20 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
22e30 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
22e40 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
22e50 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
22e60 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
22e70 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
22e80 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
22e90 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
22ea0 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
22eb0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
22ec0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
22ed0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
22ee0 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
22ef0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
22f00 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
22f10 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
22f20 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
22f30 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
22f40 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
22f50 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
22f60 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
22f70 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
22f80 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
22f90 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
22fa0 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
22fb0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
22fc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
22fd0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
22fe0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
22ff0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
23000 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
23010 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
23020 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
23030 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
23040 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
23050 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
23060 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
23070 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
23080 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
23090 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
230a0 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20  iveMode;.}..#if 
230b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
230c0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
230d0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
230e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
230f0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
23100 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
23110 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
23120 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
23130 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
23140 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
23150 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
23160 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
23170 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
23180 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
23190 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
231a0 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70 50  kstate(Pager *pP
231b0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
231c0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74 61  sqlite3OsLockSta
231d0 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  te(pPager->fd);.
231e0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
231f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
23200 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
23210 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
23220 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
23230 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
23240 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23250 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61 67  PagerRefdump(Pag
23260 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
23270 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72  gHdr *pPg;.  for
23280 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
23290 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
232a0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
232b0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30  if( pPg->nRef<=0
232c0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
232d0 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
232e0 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61 64  ntf("PAGE %3d ad
232f0 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22  dr=%p nRef=%d\n"
23300 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70  , .       pPg->p
23310 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  gno, PGHDR_TO_DA
23320 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52  TA(pPg), pPg->nR
23330 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ef);.  }.}.#endi
23340 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  f..#endif /* SQL
23350 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
23360 2a 2f 0a                                         */.