/ Hex Artifact Content
Login

Artifact a4a02246d23edcc8113f5957d7db4772d9cd71bc:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 34  : pager.c,v 1.34
0350: 34 20 32 30 30 37 2f 30 36 2f 31 36 20 30 33 3a  4 2007/06/16 03:
0360: 30 36 3a 32 38 20 64 72 68 20 45 78 70 20 24 0a  06:28 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 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  .}../*.** If SQL
5410: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20  ITE_CHECK_PAGES 
5420: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
5430: 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74  we do some sanit
5440: 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e  y checking.** on
5450: 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e 67   the cache using
5460: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e   a hash function
5470: 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
5480: 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61  for testing.** a
5490: 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  nd debugging onl
54a0: 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  y..*/.#ifdef SQL
54b0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
54c0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 33  /*.** Return a 3
54d0: 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74 68  2-bit hash of th
54e0: 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72 20  e page data for 
54f0: 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pPage..*/.static
5500: 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61 68   u32 pager_datah
5510: 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20 75  ash(int nByte, u
5520: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
5530: 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73 68  ata){.  u32 hash
5540: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
5550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74   for(i=0; i<nByt
5560: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
5570: 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29 20  h = (hash*1039) 
5580: 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  + pData[i];.  }.
5590: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
55a0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
55b0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
55c0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74 75   *pPage){.  retu
55d0: 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  rn pager_datahas
55e0: 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  h(pPage->pPager-
55f0: 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20 20  >pageSize, .    
5600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5610: 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63 68      (unsigned ch
5620: 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  ar *)PGHDR_TO_DA
5630: 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f  TA(pPage));.}../
5640: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
5650: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
5660: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
5670: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
5680: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
5690: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
56a0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
56b0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
56c0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
56d0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
56e0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
56f0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
5700: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
5710: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
5720: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
5730: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
5740: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
5750: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
5760: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
5770: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
5780: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
5790: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
57a0: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
57b0: 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c  rCode || MEMDB |
57c0: 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20  | pPg->dirty || 
57d0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
57e0: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
57f0: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
5800: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
5810: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 29 20  ger_datahash(X) 
5820: 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72   0.#define pager
5830: 5f 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a  _pagehash(X)  0.
5840: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
5850: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
5860: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
5870: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
5880: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5890: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
58a0: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
58b0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
58c0: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
58d0: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
58e0: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
58f0: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
5900: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
5910: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
5920: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
5930: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
5940: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
5950: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
5960: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
5970: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
5980: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
5990: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
59a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
59b0: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
59c0: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
59d0: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
59e0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
59f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5a00: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
5a10: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
5a20: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
5a30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
5a40: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
5a50: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
5a60: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5a70: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5a80: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5a90: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5aa0: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5ab0: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5ac0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5ad0: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5ae0: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5af0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
5b00: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
5b10: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
5b20: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
5b30: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
5b40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5b50: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
5b60: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5b70: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
5b80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5b90: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5ba0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5bb0: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5bc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5bd0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5be0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5bf0: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5c00: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
5c10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
5c20: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
5c30: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
5c40: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5c50: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
5c60: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
5c70: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5c80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5c90: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5ca0: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5cb0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5cc0: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5cd0: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5ce0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5cf0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5d00: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
5d10: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
5d20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5d30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
5d40: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
5d50: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
5d60: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5d70: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5d80: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5d90: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5da0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5db0: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5dc0: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5dd0: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5de0: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5df0: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5e00: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
5e10: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
5e20: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
5e30: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
5e40: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
5e50: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
5e60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5e70: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5e80: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5e90: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5ea0: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5eb0: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5ec0: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5ed0: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5ee0: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5ef0: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5f00: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5f10: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5f20: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5f30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
5f40: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
5f50: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5f60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5f70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5f80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5f90: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5fa0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5fb0: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5fc0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5fd0: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5fe0: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5ff0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
6000: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
6010: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
6020: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
6030: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
6040: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
6050: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
6060: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
6070: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
6080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
60a0: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
60b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
60c0: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
60e0: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
6100: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
6120: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
6130: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
6140: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
6150: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
6160: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
6170: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6180: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
6190: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
61a0: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
61b0: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
61c0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
61d0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
61e0: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
61f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6200: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
6210: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
6220: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
6230: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
6240: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
6250: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
6260: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
6270: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6280: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
6290: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
62a0: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
62b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
62c0: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
62d0: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
62e0: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
62f0: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
6300: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
6310: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
6320: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
6330: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
6340: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
6350: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
6360: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
6370: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
6380: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
6390: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
63a0: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
63b0: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
63c0: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
63d0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
63e0: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
63f0: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
6400: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6410: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
6420: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
6430: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
6440: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
6450: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
6460: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6470: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6480: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6490: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
64a0: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
64b0: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
64c0: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
64d0: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
64e0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
64f0: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
6500: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
6510: 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72  {.  char zHeader
6520: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
6530: 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e  Magic)+16];.  in
6540: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
6550: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
6560: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
6570: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
6580: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6590: 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  f;.  }..  rc = s
65a0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
65b0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
65c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
65d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
65e0: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
65f0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
6600: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
6610: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6620: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
6630: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
6640: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
6650: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
6660: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
6670: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
6680: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
6690: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
66a0: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
66b0: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
66c0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
66d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
66e0: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
66f0: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
6700: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
6710: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
6720: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
6730: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
6740: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  */.  memcpy(zHea
6750: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
6760: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6770: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a  nalMagic));.  /*
6780: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
6790: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
67a0: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
67b0: 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
67c0: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
67d0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
67e0: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
67f0: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
6800: 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e  0);.  /* The ran
6810: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
6820: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
6830: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
6840: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
6850: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
6860: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6870: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
6880: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6890: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
68a0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
68b0: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
68c0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
68d0: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
68e0: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
68f0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6900: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
6910: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
6920: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
6930: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
6940: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
6950: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
6960: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6970: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
6980: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
6990: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
69a0: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
69b0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
69c0: 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66  urnalHdr, sizeof
69d0: 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63  (zHeader))).  rc
69e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
69f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6a00: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
6a10: 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20  Header));..  /* 
6a20: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
6a30: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
6a40: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
6a50: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
6a60: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
6a70: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
6a80: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6a90: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
6aa0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6ab0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6ac0: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
6ad0: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
6ae0: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6af0: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
6b00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
6b10: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
6b20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
6b30: 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ff-1);.    if( r
6b40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
6b50: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6b60: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6b70: 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31  ->jfd, "\000", 1
6b80: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6b90: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6ba0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6bb0: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6bc0: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
6bd0: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
6be0: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
6bf0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6c00: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
6c10: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
6c20: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
6c30: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
6c40: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
6c50: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
6c60: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
6c70: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
6c80: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
6c90: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
6ca0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
6cb0: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
6cc0: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
6cd0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6ce0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
6cf0: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
6d00: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
6d10: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
6d20: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
6d30: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
6d40: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
6d50: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
6d60: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
6d70: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6d80: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
6d90: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
6da0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
6db0: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
6dc0: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
6dd0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
6de0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
6df0: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
6e00: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
6e10: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
6e20: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
6e30: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
6e40: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
6e50: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
6e60: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
6e70: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
6e80: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6e90: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
6ea0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6eb0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6ec0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
6ed0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
6ee0: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
6ef0: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
6f00: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
6f10: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
6f20: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6f30: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
6f40: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6f50: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6f60: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
6f70: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6f80: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6f90: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6fa0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6fb0: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6fc0: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6fd0: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6fe0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6ff0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
7000: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
7010: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
7020: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
7030: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7040: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
7050: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
7060: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
7070: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
7080: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7090: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
70a0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
70b0: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
70c0: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
70d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
70e0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
70f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
7100: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7110: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7120: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
7130: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
7140: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
7150: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
7160: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
7170: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
7180: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
7190: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
71a0: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
71b0: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
71c0: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
71d0: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
71e0: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
71f0: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
7200: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
7210: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
7220: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
7230: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
7240: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
7250: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
7260: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
7270: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
7280: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
7290: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
72a0: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
72b0: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
72c0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
72d0: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
72e0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
72f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
7300: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
7310: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
7320: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
7330: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
7340: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
7350: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
7360: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
7370: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
7380: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
7390: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
73a0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
73b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
73c0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
73d0: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
73e0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
73f0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
7400: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
7410: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
7420: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
7430: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
7440: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
7450: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
7460: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
7470: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
7480: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
7490: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
74a0: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
74b0: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
74c0: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
74d0: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
74e0: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
74f0: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
7500: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
7510: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
7520: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
7530: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
7540: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7550: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
7560: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
7570: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
7580: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7590: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
75a0: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
75b0: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
75c0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
75d0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
75e0: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
75f0: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
7600: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
7610: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
7620: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
7630: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
7640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7650: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
7660: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
7670: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
7680: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
7690: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
76a0: 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b  int i; .  u32 ck
76b0: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
76c0: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
76d0: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
76e0: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
76f0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
7700: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
7710: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
7720: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
7730: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
7740: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
7750: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
7760: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
7770: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
7780: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
7790: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
77a0: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
77b0: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
77c0: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
77d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
77e0: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
77f0: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
7800: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
7810: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
7820: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
7830: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
7840: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
7850: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
7860: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
7870: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
7880: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7890: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
78a0: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
78b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
78c0: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
78d0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
78e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
78f0: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
7900: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7910: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7920: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
7930: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
7940: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
7950: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
7960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7970: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32  urn rc;..  put32
7980: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7990: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
79a0: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
79b0: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
79c0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
79d0: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
79e0: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
79f0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7a00: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
7a10: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
7a20: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
7a30: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
7a40: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
7a50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7a60: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
7a70: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
7a80: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
7a90: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
7aa0: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
7ab0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
7ac0: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
7ad0: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
7ae0: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
7af0: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
7b00: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
7b10: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
7b20: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
7b30: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
7b40: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
7b50: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
7b60: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
7b70: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
7b80: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7b90: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7ba0: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7bb0: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7bc0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7bd0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7be0: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7bf0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7c00: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
7c10: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 48  g->pPager;.  PgH
7c20: 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
7c30: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
7c40: 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 61 73  g, pPager);.  as
7c50: 73 65 72 74 28 20 4d 45 4d 44 42 20 29 3b 0a 20  sert( MEMDB );. 
7c60: 20 69 66 28 20 21 70 48 69 73 74 2d 3e 69 6e 53   if( !pHist->inS
7c70: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7c80: 74 28 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53  t( pHist->pPrevS
7c90: 74 6d 74 3d 3d 30 20 26 26 20 70 48 69 73 74 2d  tmt==0 && pHist-
7ca0: 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b  >pNextStmt==0 );
7cb0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
7cc0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
7cd0: 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
7ce0: 61 67 65 72 2d 3e 70 53 74 6d 74 2c 20 70 50 61  ager->pStmt, pPa
7cf0: 67 65 72 29 2d 3e 70 50 72 65 76 53 74 6d 74 20  ger)->pPrevStmt 
7d00: 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
7d10: 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d   pHist->pNextStm
7d20: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
7d30: 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
7d40: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Stmt = pPg;.    
7d50: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
7d60: 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
7d70: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
7d80: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
7d90: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
7da0: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
7db0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7dc0: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
7dd0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
7de0: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
7df0: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
7e00: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
7e10: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
7e20: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
7e30: 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e  Hash==0 ) return
7e40: 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72   0;.  p = pPager
7e50: 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28  ->aHash[pgno & (
7e60: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
7e70: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
7e80: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
7e90: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
7ea0: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
7eb0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7ec0: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
7ed0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7ee0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7ef0: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
7f00: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
7f10: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
7f20: 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ode ){.    if( !
7f30: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
7f40: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
7f50: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
7f60: 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  CK);.      pPage
7f70: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
7f80: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
7f90: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
7fa0: 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20  ager)).    }.   
7fb0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7fc0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
7fd0: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
7fe0: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
7ff0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
8000: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
8010: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
8020: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
8030: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
8040: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
8050: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
8060: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
8070: 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a  ready entered.**
8080: 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
8090: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
80a0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
80b0: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
80c0: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43  ){.  if( p->errC
80d0: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
80e0: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
80f0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
8100: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
8110: 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  en==0 );.  if( p
8120: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
8130: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
8140: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
8150: 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61  ack(p);.  }.  pa
8160: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20  ger_unlock(p);. 
8170: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
8180: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
8190: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
81a0: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
81b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
81c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
81d0: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
81e0: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
81f0: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a  siveMode );.}...
8200: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
8210: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
8220: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
8230: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
8240: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
8250: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
8260: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
8270: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
8280: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
8290: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
82a0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
82b0: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
82c0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
82d0: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
82e0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
82f0: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
8300: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
8310: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
8320: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
8330: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
8340: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
8350: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
8360: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
8370: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
8380: 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
8390: 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22  "PGFREE %p %d\n"
83a0: 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
83b0: 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45 52  gno));.    PAGER
83c0: 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
83d0: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
83e0: 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  );.    pNext = p
83f0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
8400: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
8410: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
8420: 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  >pStmt = 0;.  pP
8430: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
8440: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72  ;.  pPager->pFir
8450: 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20  stSynced = 0;.  
8460: 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
8470: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
8480: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
8490: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
84a0: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
84b0: 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61 67 65  >aHash);.  pPage
84c0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
84d0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20 3d 20  pPager->aHash = 
84e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
84f0: 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  f = 0;.}../*.** 
8500: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 64  This routine end
8510: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  s a transaction.
8520: 20 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20    A transaction 
8530: 69 73 20 65 6e 64 65 64 20 62 79 20 65 69 74 68  is ended by eith
8540: 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f  er.** a COMMIT o
8550: 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a  r a ROLLBACK..**
8560: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
8570: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
8580: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
8590: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
85a0: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
85b0: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
85c0: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
85d0: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
85e0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c  routine will rel
85f0: 65 61 73 65 0a 2a 2a 20 74 68 65 20 64 61 74 61  ease.** the data
8600: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
8610: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
8620: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
8630: 65 20 69 66 20 74 68 61 74 20 69 73 0a 2a 2a 20  e if that is.** 
8640: 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
8650: 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65  thing to do.  Re
8660: 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75 73 75 61  lease locks usua
8670: 6c 6c 79 20 69 73 20 61 70 70 72 6f 70 72 69 61  lly is appropria
8680: 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65  te,.** unless we
8690: 20 61 72 65 20 69 6e 20 65 78 63 6c 75 73 69 76   are in exclusiv
86a0: 65 20 61 63 63 65 73 73 20 6d 6f 64 65 20 6f 72  e access mode or
86b0: 20 75 6e 6c 65 73 73 20 74 68 69 73 20 69 73 20   unless this is 
86c0: 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44  a .** COMMIT AND
86d0: 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41   BEGIN or ROLLBA
86e0: 43 4b 20 41 4e 44 20 42 45 47 49 4e 20 6f 70 65  CK AND BEGIN ope
86f0: 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ration..**.** Th
8700: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
8710: 73 20 65 69 74 68 65 72 20 64 65 6c 65 74 65 64  s either deleted
8720: 20 6f 72 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a   or truncated..*
8730: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
8740: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
8750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8760: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
8770: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
8780: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
8790: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
87a0: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
87b0: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
87c0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
87d0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
87e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
87f0: 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  int pager_end_tr
8800: 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72 20  ansaction(Pager 
8810: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
8820: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
8830: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
8840: 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
8850: 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 21  _OK;.  assert( !
8860: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 70  MEMDB );.  if( p
8870: 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
8880: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
8890: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
88a0: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  _OK;.  }.  sqlit
88b0: 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
88c0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
88d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
88e0: 6e 20 26 26 20 21 70 50 61 67 65 72 2d 3e 65 78  n && !pPager->ex
88f0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
8900: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8910: 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
8920: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
8930: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a  mtOpen = 0;.  }.
8940: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
8950: 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
8960: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63   if( pPager->exc
8970: 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20  lusiveMode .    
8980: 20 20 20 20 20 20 26 26 20 28 72 63 20 3d 20 73        && (rc = s
8990: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
89a0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
89b0: 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 3b  )==SQLITE_OK ){;
89c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
89d0: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
89e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
89f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
8a00: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
8a10: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
8a20: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
8a30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
8a40: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a  Close(&pPager->j
8a50: 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  fd);.      pPage
8a60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
8a70: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   0;.      if( rc
8a80: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
8a90: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
8aa0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
8ab0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
8ac0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
8ad0: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
8ae0: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
8af0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
8b00: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
8b10: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
8b20: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
8b30: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
8b40: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
8b50: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
8b60: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
8b70: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
8b80: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
8b90: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
8ba0: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
8bb0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
8bc0: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
8bd0: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
8be0: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
8bf0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
8c00: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
8c10: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
8c20: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
8c30: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
8c40: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
8c50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
8c60: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
8c70: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8c80: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
8c90: 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
8ca0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >useJournal==0 )
8cb0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
8cc0: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
8cd0: 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32 20 3d  ode ){.    rc2 =
8ce0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
8cf0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
8d00: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
8d10: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
8d20: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
8d30: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
8d40: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
8d50: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
8d60: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8d70: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
8d80: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
8d90: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
8da0: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8db0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
8dc0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
8dd0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
8de0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
8df0: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
8e00: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 72  bSize = -1;..  r
8e10: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
8e20: 45 5f 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a  E_OK?rc2:rc);.}.
8e30: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8e40: 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63  nd return a chec
8e50: 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67  ksum for the pag
8e60: 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a  e of data..**.**
8e70: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
8e80: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49  eal checksum.  I
8e90: 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74  t is really just
8ea0: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
8eb0: 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  .** random initi
8ec0: 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65  al value and the
8ed0: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57   page number.  W
8ee0: 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77  e experimented w
8ef0: 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75  ith.** a checksu
8f00: 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20  m of the entire 
8f10: 64 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77  data, but that w
8f20: 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74  as found to be t
8f30: 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e  oo slow..**.** N
8f40: 6f 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ote that the pag
8f50: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72  e number is stor
8f60: 65 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  ed at the beginn
8f70: 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a  ing of data and.
8f80: 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ** the checksum 
8f90: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8fa0: 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69   end.  This is i
8fb0: 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f  mportant.  If jo
8fc0: 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74  urnal.** corrupt
8fd0: 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74  ion occurs due t
8fe0: 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  o a power failur
8ff0: 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65  e, the most like
9000: 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69  ly scenario.** i
9010: 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f  s that one end o
9020: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
9030: 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  he record will b
9040: 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69  e changed.  It i
9050: 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c  s.** much less l
9060: 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74  ikely that the t
9070: 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a  wo ends of the j
9080: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69  ournal record wi
9090: 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74  ll be.** correct
90a0: 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20   and the middle 
90b0: 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75  be corrupt.  Thu
90c0: 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75  s, this "checksu
90d0: 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68  m" scheme,.** th
90e0: 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69  ough fast and si
90f0: 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68  mple, catches th
9100: 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20  e mostly likely 
9110: 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69  kind of corrupti
9120: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45  on..**.** FIX ME
9130: 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69  :  Consider addi
9140: 6e 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28  ng every 200th (
9150: 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74  or so) byte of t
9160: 68 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a  he data to the.*
9170: 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61  * checksum.  Tha
9180: 74 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c  t way if a singl
9190: 65 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f  e page spans 3 o
91a0: 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74  r more disk sect
91b0: 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20  ors and.** only 
91c0: 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f  the middle secto
91d0: 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65  r is corrupt, we
91e0: 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65   will still have
91f0: 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a   a reasonable.**
9200: 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69   chance of faili
9210: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
9220: 61 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69  and thus detecti
9230: 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a  ng the problem..
9240: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
9250: 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20  ger_cksum(Pager 
9260: 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75  *pPager, const u
9270: 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32  8 *aData){.  u32
9280: 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d   cksum = pPager-
9290: 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e  >cksumInit;.  in
92a0: 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  t i = pPager->pa
92b0: 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68  geSize-200;.  wh
92c0: 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20  ile( i>0 ){.    
92d0: 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69  cksum += aData[i
92e0: 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b  ];.    i -= 200;
92f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b  .  }.  return ck
9300: 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61  sum;.}../* Forwa
9310: 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a  rd declaration *
9320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
9330: 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b  keClean(PgHdr*);
9340: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
9350: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
9360: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9370: 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20   opened on file 
9380: 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66  descriptor.** jf
9390: 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69  d.  Playback thi
93a0: 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  s one page..**.*
93b0: 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30  * If useCksum==0
93c0: 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a   it means this j
93d0: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20  ournal does not 
93e0: 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20  use checksums.  
93f0: 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65  Checksums.** are
9400: 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61   not used in sta
9410: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
9420: 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e  because statemen
9430: 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f  t journals do no
9440: 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72  t.** need to sur
9450: 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75  vive power failu
9460: 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  res..*/.static i
9470: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
9480: 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72  k_one_page(Pager
9490: 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65   *pPager, OsFile
94a0: 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b   *jfd, int useCk
94b0: 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sum){.  int rc;.
94c0: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20    PgHdr *pPg;   
94d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94e0: 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70  /* An existing p
94f0: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
9500: 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b   */.  Pgno pgno;
9510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9520: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
9530: 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65  number of a page
9540: 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   in journal */. 
9550: 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20   u32 cksum;     
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9570: 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20  * Checksum used 
9580: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
9590: 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61  ing */.  u8 *aDa
95a0: 74 61 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65  ta = (u8 *)pPage
95b0: 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r->pTmpSpace;   
95c0: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
95d0: 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20  for a page */.. 
95e0: 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f   /* useCksum sho
95f0: 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20  uld be true for 
9600: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
9610: 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20   and false for. 
9620: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f   ** statement jo
9630: 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20  urnals.  Verify 
9640: 74 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77  that this is alw
9650: 61 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a  ays the case.  *
9660: 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20  /.  assert( jfd 
9670: 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 70  == (useCksum ? p
9680: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61  Pager->jfd : pPa
9690: 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 20 20  ger->stfd) );.  
96a0: 61 73 73 65 72 74 28 20 61 44 61 74 61 20 29 3b  assert( aData );
96b0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
96c0: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
96d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
96e0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
96f0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9700: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
9710: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9720: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
9730: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
9740: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
9750: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
9760: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
9770: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
9780: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
9790: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
97a0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
97b0: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
97c0: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
97d0: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
97e0: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
97f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
9800: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
9810: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
9820: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
9830: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
9840: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
9850: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
9860: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
9870: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
9880: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
9890: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
98a0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
98b0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
98c0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
98d0: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
98e0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
98f0: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
9900: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
9910: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
9920: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
9930: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
9940: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
9950: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
9960: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
9970: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
9980: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
9990: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
99a0: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
99b0: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
99c0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
99d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
99e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
99f0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9a00: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
9a10: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
9a20: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9a30: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
9a40: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
9a50: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
9a60: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
9a70: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
9a80: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
9a90: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
9aa0: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
9ab0: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
9ac0: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
9ad0: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
9ae0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
9af0: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
9b00: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
9b10: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
9b20: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
9b30: 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
9b40: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
9b50: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
9b60: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
9b70: 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
9b80: 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
9b90: 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
9ba0: 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
9bb0: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
9bc0: 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
9bd0: 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
9be0: 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
9bf0: 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
9c00: 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
9c10: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
9c20: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
9c30: 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
9c40: 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
9c50: 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
9c60: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
9c70: 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
9c80: 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
9c90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
9ca0: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
9cb0: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
9cc0: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
9cd0: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
9ce0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
9cf0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9d00: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
9d10: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
9d20: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
9d30: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
9d40: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
9d50: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
9d60: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
9d70: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
9d80: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
9d90: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
9da0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
9db0: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
9dc0: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
9dd0: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
9de0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
9df0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9e00: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
9e10: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
9e20: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
9e30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
9e40: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
9e50: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
9e60: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
9e70: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
9e80: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
9e90: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
9ea0: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
9eb0: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20  contents are in 
9ec0: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
9ed0: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
9ee0: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
9ef0: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f   full ROLLBACK o
9f00: 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
9f10: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72  statement.  ** r
9f20: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c  ollback the full
9f30: 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e   ROLLBACK will n
9f40: 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70  ot restore the p
9f50: 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  age to its origi
9f60: 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  nal.  ** content
9f70: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
9f80: 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65  s must be met be
9f90: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
9fa0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
9fb0: 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  * files. (1) the
9fc0: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
9fd0: 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  e locked.  (2) w
9fe0: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
9ff0: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61  original.  ** pa
a000: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e  ge content is in
a010: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
a020: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
a030: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
a040: 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f   in.  ** cache o
a050: 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72  r else it is mar
a060: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
a070: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
a080: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
a090: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50  ager, pgno);.  P
a0a0: 41 47 45 52 54 52 41 43 45 34 28 22 50 4c 41 59  AGERTRACE4("PLAY
a0b0: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 20  BACK %d page %d 
a0c0: 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
a0e0: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
a0f0: 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
a100: 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
a110: 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20  Size, aData));. 
a120: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
a130: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
a140: 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c  IVE && (pPg==0 |
a150: 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  | pPg->needSync=
a160: 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  =0) ){.    rc = 
a170: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
a180: 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
a190: 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
a1a0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
a1b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
a1c0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
a1d0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
a1e0: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
a1f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a200: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  e);.    }.    if
a210: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 6d  ( pPg ){.      m
a220: 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
a230: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70     }.  }.  if( p
a240: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
a250: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
a260: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
a270: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
a280: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
a290: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
a2a0: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
a2b0: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
a2c0: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
a2d0: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
a2e0: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
a2f0: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
a300: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
a310: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
a320: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
a330: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
a340: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
a350: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
a360: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
a370: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
a380: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69  ..    */.    voi
a390: 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a  d *pData;.    /*
a3a0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
a3b0: 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67  ef==0 || pPg->pg
a3c0: 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20  no==1 ); */.    
a3d0: 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
a3e0: 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20  _DATA(pPg);.    
a3f0: 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44  memcpy(pData, aD
a400: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
a410: 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
a420: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
a430: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
a440: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 50 67  r->xReiniter(pPg
a450: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a460: 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ze);.    }.#ifde
a470: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
a480: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
a490: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
a4a0: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
a4b0: 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66 20 74  ndif.    /* If t
a4c0: 68 69 73 20 77 61 73 20 70 61 67 65 20 31 2c 20  his was page 1, 
a4d0: 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65  then restore the
a4e0: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
a4f0: 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20 20 20  dbFileVers..    
a500: 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66 6f 72  ** Do this befor
a510: 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67 2e 20  e any decoding. 
a520: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  */.    if( pgno=
a530: 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  =1 ){.      memc
a540: 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
a550: 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 70  leVers, &((u8*)p
a560: 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65 6f 66  Data)[24],sizeof
a570: 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
a580: 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ers));.    }..  
a590: 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68 65 20    /* Decode the 
a5a0: 70 61 67 65 20 6a 75 73 74 20 72 65 61 64 20 66  page just read f
a5b0: 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20 20 20  rom disk */.    
a5c0: 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70  CODEC1(pPager, p
a5d0: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
a5e0: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
a5f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
a600: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
a610: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
a620: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
a630: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
a640: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
a650: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
a660: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
a670: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
a680: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
a690: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
a6a0: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
a6b0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
a6c0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
a6d0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
a6e0: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
a6f0: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
a700: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a710: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
a720: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
a730: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
a740: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
a750: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a760: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
a770: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
a780: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
a790: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
a7a0: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
a7b0: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
a7c0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
a7d0: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
a7e0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
a7f0: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
a800: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
a810: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
a820: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
a830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
a840: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
a850: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
a860: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 2a   = 0;.  OsFile *
a870: 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 63 68  master = 0;.  ch
a880: 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ar *zMasterJourn
a890: 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65  al = 0; /* Conte
a8a0: 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  nts of master jo
a8b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
a8c0: 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  i64 nMasterJourn
a8d0: 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  al;       /* Siz
a8e0: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
a8f0: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f  nal file */..  /
a900: 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
a910: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  r journal file e
a920: 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61  xclusively in ca
a930: 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  se some other pr
a940: 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75  ocess.  ** is ru
a950: 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69  nning this routi
a960: 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61  ne also. Not tha
a970: 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d  t it makes too m
a980: 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a  uch difference..
a990: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
a9a0: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
a9b0: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
a9c0: 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  er);.  assert( r
a9d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
a9e0: 6d 61 73 74 65 72 20 29 3b 0a 20 20 69 66 28 20  master );.  if( 
a9f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
aa00: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
aa10: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
aa20: 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71  n = 1;.  rc = sq
aa30: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
aa40: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
aa50: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
aa60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
aa70: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
aa80: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
aa90: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
aaa0: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
aab0: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
aac0: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
aad0: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
aae0: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
aaf0: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
ab00: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
ab10: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
ab20: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
ab30: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
ab40: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
ab50: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
ab60: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
ab70: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
ab80: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
ab90: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
aba0: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
abb0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
abc0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
abd0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
abe0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
abf0: 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72 2c 20  3OsRead(master, 
ac00: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
ac10: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
ac20: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ac30: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
ac40: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
ac50: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
ac60: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
ac70: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
ac80: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
ac90: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
aca0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
acb0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
acc0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
acd0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
ace0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
acf0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
ad00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
ad10: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
ad20: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
ad30: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
ad40: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
ad50: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
ad60: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
ad70: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
ad80: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
ad90: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
ada0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
adb0: 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20 3d 20  File *journal = 
adc0: 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  0;.        int c
add0: 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
ade0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
adf0: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
ae00: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
ae10: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
ae20: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f 75 72  QLITE_OK || jour
ae30: 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 69  nal );.        i
ae40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
ae50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
ae60: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
ae70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
ae80: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
ae90: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f 75 72  sterJournal(jour
aea0: 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72  nal, &zMasterPtr
aeb0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
aec0: 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e  e3OsClose(&journ
aed0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
aee0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
aef0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
af00: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
af10: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
af20: 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
af30: 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a  r!=0 && strcmp(z
af40: 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74  MasterPtr, zMast
af50: 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20  er)==0;.        
af60: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
af70: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
af80: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20  if( c ){.       
af90: 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20     /* We have a 
afa0: 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65  match. Do not de
afb0: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
afc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f  journal file. */
afd0: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
afe0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
aff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
b000: 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  .      zJournal 
b010: 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72  += (strlen(zJour
b020: 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20  nal)+1);.    }. 
b030: 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c   }.  .  rc = sql
b040: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
b050: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
b060: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
b070: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
b080: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
b090: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
b0a0: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
b0b0: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
b0c0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
b0d0: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
b0e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74  urn rc;.}...stat
b0f0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 74 72  ic void pager_tr
b100: 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50 61 67  uncate_cache(Pag
b110: 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a 2f 2a  er *pPager);../*
b120: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
b130: 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74 68   main file of th
b140: 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74 6f  e given pager to
b150: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
b160: 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65  ages.** indicate
b170: 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61 74 65  d. Also truncate
b180: 20 74 68 65 20 63 61 63 68 65 64 20 72 65 70 72   the cached repr
b190: 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
b1a0: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
b1b0: 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75 6e  c int pager_trun
b1c0: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
b1d0: 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a  er, int nPage){.
b1e0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
b1f0: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
b200: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
b210: 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20  _EXCLUSIVE ){.  
b220: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b230: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
b240: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
b250: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
b260: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
b270: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b280: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
b290: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61   = nPage;.    pa
b2a0: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
b2b0: 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  he(pPager);.  }.
b2c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b2d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65  /*.** Set the se
b2e0: 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65  ctorSize for the
b2f0: 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
b300: 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73  .** The sector s
b310: 69 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67 65  ize is the large
b320: 72 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  r of the sector 
b330: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
b340: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
b350: 74 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68  torSize() and th
b360: 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73  e pageSize..*/.s
b370: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
b380: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
b390: 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61 67 65  pPager){.  pPage
b3a0: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
b3b0: 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
b3c0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
b3d0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
b3e0: 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65 72  ectorSize<pPager
b3f0: 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
b400: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
b410: 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
b420: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a 0a  ageSize;.  }.}..
b430: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
b440: 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  he journal and t
b450: 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20  hus restore the 
b460: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
b470: 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74  .** the state it
b480: 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77   was in before w
b490: 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67  e started making
b4a0: 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a   changes.  .**.*
b4b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
b4c0: 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20  le format is as 
b4d0: 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20  follows: .**.** 
b4e0: 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65   (1)  8 byte pre
b4f0: 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20  fix.  A copy of 
b500: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
b510: 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65  .**  (2)  4 byte
b520: 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
b530: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b540: 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64   number of valid
b550: 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a   page records.**
b560: 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f         in the jo
b570: 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20  urnal.  If this 
b580: 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66  value is 0xfffff
b590: 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74  fff, then comput
b5a0: 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e  e the.**       n
b5b0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
b5c0: 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a  cords from the j
b5d0: 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20  ournal size..** 
b5e0: 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67   (3)  4 byte big
b5f0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
b600: 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69  which is the ini
b610: 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74  tial value for t
b620: 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e  he .**       san
b630: 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ity checksum..**
b640: 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e    (4)  4 byte in
b650: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
b660: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
b670: 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  es to truncate t
b680: 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61  he.**       data
b690: 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61  base to during a
b6a0: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28   rollback..**  (
b6b0: 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  5)  4 byte integ
b6c0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
b6d0: 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
b6e0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  in the master jo
b6f0: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e  urnal.**       n
b700: 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65 20  ame.  The value 
b710: 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e 64  may be zero (ind
b720: 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72 65  icate that there
b730: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a   is no master.**
b740: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29         journal.)
b750: 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74 65  .**  (6)  N byte
b760: 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  s of the master 
b770: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54  journal name.  T
b780: 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20  he name will be 
b790: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a  nul-terminated.*
b7a0: 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67 68  *       and migh
b7b0: 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68 61  t be shorter tha
b7c0: 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  n the value read
b7d0: 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20 74   from (5).  If t
b7e0: 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a 2a  he first byte.**
b7f0: 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e 61         of the na
b800: 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e 20  me is \000 then 
b810: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73 74  there is no mast
b820: 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65  er journal.  The
b830: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
b840: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73   journal name is
b850: 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d 38   stored in UTF-8
b860: 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f 20  ..**  (7)  Zero 
b870: 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69 6e  or more pages in
b880: 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61 73  stances, each as
b890: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20   follows:.**    
b8a0: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70 61      +  4 byte pa
b8b0: 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20  ge number..**   
b8c0: 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d 3e       +  pPager->
b8d0: 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f  pageSize bytes o
b8e0: 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20  f data..**      
b8f0: 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65 63    +  4 byte chec
b900: 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ksum.**.** When 
b910: 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65 20  we speak of the 
b920: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c 20  journal header, 
b930: 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72 73  we mean the firs
b940: 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65 2e  t 6 items above.
b950: 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20 69  .** Each entry i
b960: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
b970: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
b980: 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a  the 7th item..**
b990: 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61 6c  .** Call the val
b9a0: 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63 6f  ue from the seco
b9b0: 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63 22  nd bullet "nRec"
b9c0: 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20 6e  .  nRec is the n
b9d0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69  umber of.** vali
b9e0: 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20 69  d page entries i
b9f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
ba00: 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 79  In most cases, y
ba10: 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ou can compute t
ba20: 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e  he.** value of n
ba30: 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  Rec from the siz
ba40: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
ba50: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20 61   file.  But if a
ba60: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
ba70: 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  e occurred while
ba80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
ba90: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 20   being written, 
baa0: 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65 0a  it could be the.
bab0: 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68 65  ** case that the
bac0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
bad0: 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61 6c  rnal file had al
bae0: 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65  ready been incre
baf0: 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65 20  ased but.** the 
bb00: 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68 61  extra entries ha
bb10: 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20 69  d not yet made i
bb20: 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73 6b  t safely to disk
bb30: 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61 73  .  In such a cas
bb40: 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  e,.** the value 
bb50: 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64  of nRec computed
bb60: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
bb70: 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f  ize would be too
bb80: 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20   large.  For.** 
bb90: 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65 20  that reason, we 
bba0: 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20 6e  always use the n
bbb0: 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68 65  Rec value in the
bbc0: 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   header..**.** I
bbd0: 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  f the nRec value
bbe0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20 69   is 0xffffffff i
bbf0: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52 65  t means that nRe
bc00: 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70  c should be comp
bc10: 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  uted.** from the
bc20: 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68 69   file size.  Thi
bc30: 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64 20  s value is used 
bc40: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73 65  when the user se
bc50: 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d  lects the.** no-
bc60: 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20  sync option for 
bc70: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20  the journal.  A 
bc80: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
bc90: 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72 72  uld lead to corr
bca0: 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69  uption.** in thi
bcb0: 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f 72  s case.  But for
bcc0: 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d   things like tem
bcd0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77 68  porary table (wh
bce0: 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64  ich will be.** d
bcf0: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
bd00: 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72 65  power is restore
bd10: 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72 65  d) we don't care
bd20: 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  .  .**.** If the
bd30: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73 20   file opened as 
bd40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bd50: 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66   is not a well-f
bd60: 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ormed.** journal
bd70: 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70   file then all p
bd80: 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20 66  ages up to the f
bd90: 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20 70  irst corrupted p
bda0: 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a  age are rolled.*
bdb0: 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61  * back (or no pa
bdc0: 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72 6e  ges if the journ
bdd0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f 72  al header is cor
bde0: 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f 75  rupted). The jou
bdf0: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20  rnal file.** is 
be00: 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e 64  then deleted and
be10: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
be20: 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66 20  ned, just as if 
be30: 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68 61  no corruption ha
be40: 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e  d.** been encoun
be50: 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  tered..**.** If 
be60: 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63  an I/O or malloc
be70: 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  () error occurs,
be80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c   the journal-fil
be90: 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65 64  e is not deleted
bea0: 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
beb0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
bec0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
bed0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
bee0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
bef0: 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 69 36 34  nt isHot){.  i64
bf00: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
bf10: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
bf20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
bf30: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
bf40: 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20  u32 nRec;       
bf50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bf60: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e  er of Records in
bf70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   the journal */.
bf80: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
bf90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bfa0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bfb0: 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20  Pgno mxPg = 0;  
bfc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
bfd0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
bfe0: 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a   file in pages *
bff0: 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
c000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c010: 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61  Result code of a
c020: 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20   subroutine */. 
c030: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
c040: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
c050: 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
c060: 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
c070: 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
c080: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
c090: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
c0a0: 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
c0b0: 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
c0c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
c0d0: 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
c0e0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
c0f0: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
c100: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
c110: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
c120: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
c130: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
c140: 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
c150: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
c160: 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
c170: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c180: 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
c190: 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
c1a0: 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
c1b0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
c1c0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
c1d0: 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
c1e0: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
c1f0: 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
c200: 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
c210: 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
c220: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
c230: 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
c240: 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
c250: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
c260: 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
c270: 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b  >jfd, &zMaster);
c280: 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53  .  assert( rc!=S
c290: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
c2a0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c2b0: 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26  K || (zMaster &&
c2c0: 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45   !sqlite3OsFileE
c2d0: 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20  xists(zMaster)) 
c2e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
c2f0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(zMaster);.    
c300: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
c310: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c320: 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49  DONE ) rc = SQLI
c330: 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
c340: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
c350: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  }.  sqlite3OsSee
c360: 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30  k(pPager->jfd, 0
c370: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
c380: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  rnalOff = 0;..  
c390: 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72  /* This loop ter
c3a0: 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77  minates either w
c3b0: 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72  hen the readJour
c3c0: 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65  nalHdr() call re
c3d0: 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54  turns.  ** SQLIT
c3e0: 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20  E_DONE or an IO 
c3f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f  error occurs. */
c400: 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a  .  while( 1 ){..
c410: 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
c420: 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  next journal hea
c430: 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
c440: 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74  rnal file.  If t
c450: 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  here are.    ** 
c460: 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73  not enough bytes
c470: 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75   left in the jou
c480: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20  rnal file for a 
c490: 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c  complete header,
c4a0: 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73   or.    ** it is
c4b0: 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e   corrupted, then
c4c0: 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20   a process must 
c4d0: 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20  of failed while 
c4e0: 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20  writing it..    
c4f0: 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65  ** This indicate
c500: 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e  s nothing more n
c510: 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  eeds to be rolle
c520: 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20  d back..    */. 
c530: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
c540: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
c550: 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67  zJ, &nRec, &mxPg
c560: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
c570: 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20  QLITE_OK ){ .   
c580: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
c590: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
c5a0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
c5b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c5c0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
c5d0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
c5e0: 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66   If nRec is 0xff
c5f0: 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69  ffffff, then thi
c600: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72  s journal was cr
c610: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
c620: 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e  ss.    ** workin
c630: 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  g in no-sync mod
c640: 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68  e. This means th
c650: 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  at the rest of t
c660: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
c670: 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  * file consists 
c680: 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20  of pages, there 
c690: 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72  are no more jour
c6a0: 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d  nal headers. Com
c6b0: 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20  pute.    ** the 
c6c0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61  value of nRec ba
c6d0: 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75  sed on this assu
c6e0: 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mption..    */. 
c6f0: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66     if( nRec==0xf
c700: 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20  fffffff ){.     
c710: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
c720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55  >journalOff==JOU
c730: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
c740: 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65  er) );.      nRe
c750: 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  c = (szJ - JOURN
c760: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
c770: 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
c780: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
c790: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
c7a0: 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
c7b0: 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
c7c0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
c7d0: 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
c7e0: 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20 74 68  * process. In th
c7f0: 69 73 20 63 61 73 65 20 74 68 65 20 72 65 73 74  is case the rest
c800: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c810: 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  file consists of
c820: 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 6c  .    ** journall
c830: 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70 61 67  ed copies of pag
c840: 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
c850: 62 65 20 72 65 61 64 20 62 61 63 6b 20 69 6e 74  be read back int
c860: 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20 20  o the cache..   
c870: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
c880: 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 29 7b  ==0 && !isHot ){
c890: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
c8a0: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
c8b0: 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e  rnalOff) / JOURN
c8c0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
c8d0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
c8e0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
c8f0: 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
c900: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
c910: 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
c920: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
c930: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
c940: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
c950: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
c960: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c970: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
c980: 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
c990: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
c9a0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
c9b0: 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
c9c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c9d0: 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
c9e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
c9f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
ca00: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
ca10: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
ca20: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
ca30: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
ca40: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
ca50: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
ca60: 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
ca70: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
ca80: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
ca90: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
caa0: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  jfd, 1);.      i
cab0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cac0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
cad0: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
cae0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
caf0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
cb00: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
cb10: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b  ournalOff = szJ;
cb20: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
cb30: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
cb40: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
cb50: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
cb60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
cb70: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f      }.  }.  /*NO
cb80: 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61 73 73  TREACHED*/.  ass
cb90: 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64 5f 70  ert( 0 );..end_p
cba0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
cbb0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
cbc0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
cbd0: 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
cbe0: 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
cbf0: 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( zMaster ){.   
cc00: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73   /* If there was
cc10: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
cc20: 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69  l and this routi
cc30: 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 73  ne will return s
cc40: 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a 20 73  uccess,.    ** s
cc50: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
cc60: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
cc70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
cc80: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
cc90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
cca0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
ccb0: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d  ger_delmaster(zM
ccc0: 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  aster);.    }.  
ccd0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
cce0: 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
ccf0: 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
cd00: 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
cd10: 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
cd20: 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
cd30: 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
cd40: 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
cd50: 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
cd60: 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
cd70: 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
cd80: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
cd90: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
cda0: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
cdb0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
cdc0: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
cdd0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
cde0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
cdf0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
ce00: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
ce10: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
ce20: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
ce30: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
ce40: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
ce50: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
ce60: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
ce70: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
ce80: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
ce90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
cea0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
ceb0: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
cec0: 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
ced0: 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
cee0: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
cef0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
cf00: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
cf10: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
cf20: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
cf30: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
cf40: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
cf50: 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
cf60: 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
cf70: 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
cf80: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
cf90: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
cfa0: 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
cfb0: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
cfc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cfd0: 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
cfe0: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
cff0: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d010: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
d020: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
d030: 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
d040: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
d050: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d060: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
d070: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
d080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d090: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
d0a0: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
d0b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
d0c0: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
d0d0: 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
d0e0: 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
d0f0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
d100: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
d110: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
d120: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d130: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
d140: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
d150: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
d160: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
d170: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
d180: 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20  fset just after 
d190: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
d1a0: 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ast journal.  **
d1b0: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65   page written be
d1c0: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a  fore the first j
d1d0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f  ournal-header fo
d1e0: 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
d1f0: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
d200: 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f  n was written, o
d210: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
d220: 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
d230: 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
d240: 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
d250: 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
d260: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
d270: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
d280: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
d290: 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
d2a0: 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
d2b0: 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
d2c0: 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
d2d0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
d2e0: 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
d2f0: 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
d300: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
d310: 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
d320: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
d330: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
d340: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
d350: 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46  HARED );..  /* F
d360: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
d370: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
d380: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
d390: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
d3a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d3b0: 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
d3c0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
d3d0: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53   );.  sqlite3OsS
d3e0: 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64  eek(pPager->stfd
d3f0: 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  , 0);.  nRec = p
d400: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
d410: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
d420: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
d430: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
d440: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
d450: 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
d460: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
d470: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
d480: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d490: 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
d4a0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
d4b0: 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
d4c0: 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
d4d0: 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
d4e0: 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
d4f0: 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
d500: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52  .  */.  for(i=nR
d510: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
d520: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d530: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
d540: 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
d550: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
d560: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d570: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d580: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d590: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d5a0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
d5b0: 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73  .  /* Now roll s
d5c0: 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66  ome pages back f
d5d0: 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74  rom the transact
d5e0: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67  ion journal. Pag
d5f0: 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a  er.stmtJSize.  *
d600: 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f  * was the size o
d610: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
d620: 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61  le when this sta
d630: 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74  tement was start
d640: 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72  ed, so.  ** ever
d650: 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61  ything after tha
d660: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f  t needs to be ro
d670: 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65  lled back, eithe
d680: 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20  r into the.  ** 
d690: 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65  database, the me
d6a0: 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62  mory cache, or b
d6b0: 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  oth..  **.  ** I
d6c0: 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f  f it is not zero
d6d0: 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d  , then Pager.stm
d6e0: 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f  tHdrOff is the o
d6f0: 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61  ffset to the sta
d700: 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66  rt.  ** of the f
d710: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
d720: 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69  der written duri
d730: 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  ng this statemen
d740: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
d750: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
d760: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
d770: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
d780: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
d790: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d7a0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
d7b0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
d7c0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
d7d0: 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
d7e0: 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61  stmtJSize;.  pPa
d7f0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d  ger->cksumInit =
d800: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
d810: 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61  um;.  while( pPa
d820: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d830: 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20  < hdrOff ){.    
d840: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
d850: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
d860: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
d870: 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
d880: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
d890: 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  E );.    if( rc!
d8a0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
d8b0: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d8c0: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c  ack;.  }..  whil
d8d0: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
d8e0: 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20  alOff < szJ ){. 
d8f0: 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20     u32 nJRec;   
d900: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d910: 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72  of Journal Recor
d920: 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75  ds */.    u32 du
d930: 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  mmy;.    rc = re
d940: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
d950: 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63  ger, szJ, &nJRec
d960: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
d970: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d980: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
d990: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
d9a0: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
d9b0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d9c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
d9d0: 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20   nJRec==0 ){.   
d9e0: 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20     nJRec = (szJ 
d9f0: 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  - pPager->journa
da00: 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d  lOff) / (pPager-
da10: 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20  >pageSize+8);.  
da20: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a    }.    for(i=nJ
da30: 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70  Rec-1; i>=0 && p
da40: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
da50: 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20  f < szJ; i--){. 
da60: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
da70: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
da80: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
da90: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
daa0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
dab0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
dac0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
dad0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
dae0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
daf0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
db00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
db10: 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74  szJ;.  .end_stmt
db20: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
db30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc==SQLITE_OK) 
db40: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
db50: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
db60: 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c      /* pager_rel
db70: 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
db80: 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  ); */.  }.  retu
db90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
dba0: 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d  Change the maxim
dbb0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d  um number of in-
dbc0: 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61  memory pages tha
dbd0: 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a  t are allowed..*
dbe0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
dbf0: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
dc00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
dc10: 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66  nt mxPage){.  if
dc20: 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20  ( mxPage>10 ){. 
dc30: 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67     pPager->mxPag
dc40: 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65  e = mxPage;.  }e
dc50: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
dc60: 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20  >mxPage = 10;.  
dc70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73  }.}../*.** Adjus
dc80: 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73  t the robustness
dc90: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
dca0: 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74   to damage due t
dcb0: 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20  o OS crashes.** 
dcc0: 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
dcd0: 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68  s by changing th
dce0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63  e number of sync
dcf0: 73 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e  s()s when writin
dd00: 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63  g.** the rollbac
dd10: 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72  k journal.  Ther
dd20: 65 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65  e are three leve
dd30: 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46  ls:.**.**    OFF
dd40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
dd50: 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20  Sync() is never 
dd60: 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73  called.  This is
dd70: 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20   the default.** 
dd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
dd90: 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74   temporary and t
dda0: 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a  ransient files..
ddb0: 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20  **.**    NORMAL 
ddc0: 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69     The journal i
ddd0: 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65  s synced once be
dde0: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
ddf0: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
de00: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
de10: 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d  e.  This is norm
de20: 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72  ally adequate pr
de30: 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a  otection, but.**
de40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
de50: 20 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c   is theoreticall
de60: 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75  y possible, thou
de70: 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79  gh very unlikely
de80: 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ,.**            
de90: 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72    that an inoper
dea0: 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75  tune power failu
deb0: 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74  re could leave t
dec0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  he journal.**   
ded0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20             in a 
dee0: 73 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c  state which woul
def0: 64 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74  d cause damage t
df00: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  o the database.*
df10: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  *              w
df20: 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  hen it is rolled
df30: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   back..**.**    
df40: 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f  FULL      The jo
df50: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
df60: 74 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69  twice before wri
df70: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
df80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
df90: 20 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20   database (with 
dfa0: 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20  some additional 
dfb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68  information - th
dfc0: 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20  e nRec field.** 
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20               of 
dfe0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
dff0: 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74  er - being writt
e000: 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  en in between th
e010: 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20  e two.**        
e020: 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49        syncs).  I
e030: 66 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74  f we assume that
e040: 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20   writing a.**   
e050: 20 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c             singl
e060: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73  e disk sector is
e070: 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68   atomic, then th
e080: 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73  is mode provides
e090: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
e0a0: 20 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20   assurance that 
e0b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c  the journal will
e0c0: 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65   not be corrupte
e0d0: 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20  d to the.**     
e0e0: 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f           point o
e0f0: 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65  f causing damage
e100: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
e110: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
e120: 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20  ..**.** Numeric 
e130: 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65  values associate
e140: 64 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61  d with these sta
e150: 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20  tes are OFF==1, 
e160: 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64  NORMAL=2,.** and
e170: 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e   FULL=3..*/.#ifn
e180: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e190: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f  PAGER_PRAGMAS.vo
e1a0: 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
e1b0: 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61  etSafetyLevel(Pa
e1c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
e1d0: 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c   level, int full
e1e0: 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65  _fsync){.  pPage
e1f0: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
e200: 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
e210: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
e220: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
e230: 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
e240: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
e250: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
e260: 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63  ync = full_fsync
e270: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e280: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
e290: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d  >needSync = 0;.}
e2a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
e2b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f  he following glo
e2c0: 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20  bal variable is 
e2d0: 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e  incremented when
e2e0: 65 76 65 72 20 74 68 65 20 6c 69 62 72 61 72 79  ever the library
e2f0: 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20  .** attempts to 
e300: 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  open a temporary
e310: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66   file.  This inf
e320: 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64  ormation is used
e330: 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20   for.** testing 
e340: 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
e350: 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y.  .*/.#ifdef S
e360: 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73  QLITE_TEST.int s
e370: 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f  qlite3_opentemp_
e380: 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  count = 0;.#endi
e390: 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
e3a0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
e3b0: 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  .**.** Write the
e3c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
e3d0: 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75   into *fd.  Retu
e3e0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
e3f0: 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a  success or some.
e400: 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  ** other error c
e410: 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a  ode if we fail..
e420: 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c  **.** The OS wil
e430: 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  l automatically 
e440: 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f  delete the tempo
e450: 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69  rary file when i
e460: 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a  t is.** closed..
e470: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
e480: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
e490: 6d 70 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29  mp(OsFile **pFd)
e4a0: 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b  {.  int cnt = 8;
e4b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
e4c0: 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54  r zFile[SQLITE_T
e4d0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a  EMPNAME_SIZE];..
e4e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
e4f0: 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
e500: 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
e510: 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
e520: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
e530: 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
e540: 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b    do{.    cnt--;
e550: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65  .    sqlite3OsTe
e560: 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65  mpFileName(zFile
e570: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
e580: 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
e590: 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31  ve(zFile, pFd, 1
e5a0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e5b0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
e5c0: 2a 70 46 64 20 29 3b 0a 20 20 7d 77 68 69 6c 65  *pFd );.  }while
e5d0: 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53  ( cnt>0 && rc!=S
e5e0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
e5f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
e600: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e610: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
e620: 65 77 20 70 61 67 65 20 63 61 63 68 65 20 61 6e  ew page cache an
e630: 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20  d put a pointer 
e640: 74 6f 20 74 68 65 20 70 61 67 65 20 63 61 63 68  to the page cach
e650: 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a  e in *ppPager..*
e660: 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65  * The file to be
e670: 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74   cached need not
e680: 20 65 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c   exist.  The fil
e690: 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20  e is not locked 
e6a0: 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72  until.** the fir
e6b0: 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  st call to sqlit
e6c0: 65 33 50 61 67 65 72 47 65 74 28 29 20 61 6e 64  e3PagerGet() and
e6d0: 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70   is only held op
e6e0: 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  en until the.** 
e6f0: 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
e700: 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69  eased using sqli
e710: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
e720: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
e730: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
e740: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
e750: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
e760: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
e770: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
e780: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
e790: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
e7a0: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
e7b0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
e7c0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
e7d0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
e7e0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
e7f0: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
e800: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
e810: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
e820: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
e830: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
e840: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
e850: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
e860: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
e870: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
e880: 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61 67 65  agerOpen(.  Page
e890: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
e8a0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
e8b0: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
e8c0: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
e8d0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
e8e0: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
e8f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e900: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
e910: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
e920: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
e930: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
e940: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
e950: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66   page */.  int f
e960: 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
e970: 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e      /* flags con
e980: 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69  trolling this fi
e990: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
e9a0: 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20   *pPager = 0;.  
e9b0: 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e  char *zFullPathn
e9c0: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ame = 0;.  int n
e9d0: 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f 6d 70  ameLen;  /* Comp
e9e0: 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e 20 54  iler is wrong. T
e9f0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 69 6e  his is always in
ea00: 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f 72 65  itialized before
ea10: 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69 6c 65   use */.  OsFile
ea20: 20 2a 66 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20   *fd = 0;.  int 
ea30: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ea40: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
ea50: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
ea60: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
ea70: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
ea80: 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
ea90: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
eaa0: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
eab0: 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
eac0: 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
ead0: 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
eae0: 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20  OCK)!=0;.  char 
eaf0: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
eb00: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66  PNAME_SIZE];.#if
eb10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
eb20: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
eb30: 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  ENT.  /* A mallo
eb40: 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  c() cannot fail 
eb50: 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65 61 64  in sqlite3Thread
eb60: 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72  Data() as one or
eb70: 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a   more calls to .
eb80: 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75    ** malloc() mu
eb90: 73 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  st have already 
eba0: 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69  been made by thi
ebb0: 73 20 74 68 72 65 61 64 20 62 65 66 6f 72 65 20  s thread before 
ebc0: 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20  it gets.  ** to 
ebd0: 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73  this point. This
ebe0: 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72 65 61   means the Threa
ebf0: 64 44 61 74 61 20 6d 75 73 74 20 68 61 76 65 20  dData must have 
ec00: 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
ec10: 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74  lready.  ** so t
ec20: 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e  hat ThreadData.n
ec30: 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74  Alloc can be set
ec40: 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69  . It would be ni
ec50: 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a  ce to assert.  *
ec60: 2a 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74  * that ThreadDat
ec70: 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d  a.nAlloc is non-
ec80: 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74  zero, but alas t
ec90: 68 69 73 20 62 72 65 61 6b 73 20 74 65 73 74 20  his breaks test 
eca0: 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74  cases .  ** writ
ecb0: 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68  ten to invoke th
ecc0: 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6c 79  e pager directly
ecd0: 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44  ..  */.  ThreadD
ece0: 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69  ata *pTsd = sqli
ecf0: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 3b  te3ThreadData();
ed00: 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20  .  assert( pTsd 
ed10: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
ed20: 57 65 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  We used to test 
ed30: 69 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61 64 20  if malloc() had 
ed40: 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64 20 62  already failed b
ed50: 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67  efore proceeding
ed60: 2e 20 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20  . .  ** But the 
ed70: 77 61 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f  way this functio
ed80: 6e 20 69 73 20 75 73 65 64 20 69 6e 20 53 51 4c  n is used in SQL
ed90: 69 74 65 20 6d 65 61 6e 73 20 74 68 61 74 20 63  ite means that c
eda0: 61 6e 20 6e 65 76 65 72 0a 20 20 2a 2a 20 68 61  an never.  ** ha
edb0: 70 70 65 6e 2e 20 46 75 72 74 68 65 72 6d 6f 72  ppen. Furthermor
edc0: 65 2c 20 69 66 20 74 68 65 20 6d 61 6c 6c 6f 63  e, if the malloc
edd0: 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 69 73 20  -failed flag is 
ede0: 61 6c 72 65 61 64 79 20 73 65 74 2c 20 0a 20 20  already set, .  
edf0: 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20 63 61  ** either the ca
ee00: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 53 74 72 44  ll to sqliteStrD
ee10: 75 70 28 29 20 6f 72 20 73 71 6c 69 74 65 4d 61  up() or sqliteMa
ee20: 6c 6c 6f 63 28 29 20 62 65 6c 6f 77 20 77 69 6c  lloc() below wil
ee30: 6c 0a 20 20 2a 2a 20 66 61 69 6c 20 73 68 6f 72  l.  ** fail shor
ee40: 74 6c 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4e  tly and SQLITE_N
ee50: 4f 4d 45 4d 20 72 65 74 75 72 6e 65 64 20 61 6e  OMEM returned an
ee60: 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 2a 70 70  yway..  */.  *pp
ee70: 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a  Pager = 0;..  /*
ee80: 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20   Open the pager 
ee90: 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46 75  file and set zFu
eea0: 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70 6f  llPathname to po
eeb0: 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29 65  int at malloc()e
eec0: 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 63  d .  ** memory c
eed0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6f  ontaining the co
eee0: 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65 20  mplete filename 
eef0: 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67 20  (i.e. including 
ef00: 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e 0a  the directory)..
ef10: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
ef20: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
ef30: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
ef40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
ef50: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
ef60: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
ef70: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
ef80: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
ef90: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
efa0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
efb0: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65 6c  Dup("");.    }el
efc0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
efd0: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
efe0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
eff0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
f000: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  ename);.      if
f010: 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20  ( zFullPathname 
f020: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
f030: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
f040: 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74 68  dWrite(zFullPath
f050: 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61 64  name, &fd, &read
f060: 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 20 20 61  Only);.        a
f070: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
f080: 45 5f 4f 4b 20 7c 7c 20 66 64 20 29 3b 0a 20 20  E_OK || fd );.  
f090: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
f0a0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
f0b0: 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
f0c0: 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  mp(&fd);.    sql
f0d0: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
f0e0: 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 7a  me(zTemp);.    z
f0f0: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
f100: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
f110: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
f120: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
f130: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
f140: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
f150: 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
f160: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
f170: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
f180: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
f190: 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  e. As part of th
f1a0: 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f  e same allocatio
f1b0: 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  n, allocate.  **
f1c0: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66   space for the f
f1d0: 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65  ull paths of the
f1e0: 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79   file, directory
f1f0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   and journal .  
f200: 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e  ** (Pager.zFilen
f210: 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65  ame, Pager.zDire
f220: 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e  ctory and Pager.
f230: 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a  zJournal)..  */.
f240: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
f250: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c  ame ){.    nameL
f260: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
f270: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
f280: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
f290: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
f2a0: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
f2b0: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20 20 69  *3 + 30 );.    i
f2c0: 66 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d  f( pPager && rc=
f2d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f2e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70      pPager->pTmp
f2f0: 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a 29  Space = (char *)
f300: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
f310: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
f320: 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 7d  AGE_SIZE);.    }
f330: 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 61  .  }...  /* If a
f340: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
f350: 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68 65  in either of the
f360: 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20 66   blocks above, f
f370: 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 0a  ree the memory .
f380: 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
f390: 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  by zFullPathname
f3a0: 2c 20 66 72 65 65 20 74 68 65 20 50 61 67 65 72  , free the Pager
f3b0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63   structure and c
f3c0: 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 66  lose the .  ** f
f3d0: 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65 20 70  ile. Since the p
f3e0: 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f  ager is not allo
f3f0: 63 61 74 65 64 20 74 68 65 72 65 20 69 73 20 6e  cated there is n
f400: 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20  o need to set . 
f410: 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72   ** any Pager.er
f420: 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e  rMask variables.
f430: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61  .  */.  if( !pPa
f440: 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50 61 74  ger || !zFullPat
f450: 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67 65 72  hname || !pPager
f460: 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c 20 72  ->pTmpSpace || r
f470: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f480: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
f490: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73 71 6c  se(&fd);.    sql
f4a0: 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74  iteFree(zFullPat
f4b0: 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71 6c 69  hname);.    sqli
f4c0: 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
f4d0: 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63 3d      return ((rc=
f4e0: 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c 49  =SQLITE_OK)?SQLI
f4f0: 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20 20  TE_NOMEM:rc);.  
f500: 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  }..  PAGERTRACE3
f510: 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c  ("OPEN %d %s\n",
f520: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
f530: 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ), zFullPathname
f540: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
f550: 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
f560: 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  ager, zFullPathn
f570: 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72 2d 3e  ame)).  pPager->
f580: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
f590: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
f5a0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
f5b0: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
f5c0: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
f5d0: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
f5e0: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
f5f0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
f600: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 6d 65 6d 63  meLen+1];.  memc
f610: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
f620: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
f630: 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31 29 3b  ame, nameLen+1);
f640: 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72  .  memcpy(pPager
f650: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46  ->zDirectory, zF
f660: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e 61 6d  ullPathname, nam
f670: 65 4c 65 6e 2b 31 29 3b 0a 0a 20 20 66 6f 72 28  eLen+1);..  for(
f680: 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26  i=nameLen; i>0 &
f690: 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  & pPager->zDirec
f6a0: 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20  tory[i-1]!='/'; 
f6b0: 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30  i--){}.  if( i>0
f6c0: 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65   ) pPager->zDire
f6d0: 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a  ctory[i-1] = 0;.
f6e0: 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d    memcpy(pPager-
f6f0: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c  >zJournal, zFull
f700: 50 61 74 68 6e 61 6d 65 2c 6e 61 6d 65 4c 65 6e  Pathname,nameLen
f710: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
f720: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f730: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
f740: 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c  ->zJournal[nameL
f750: 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  en], "-journal",
f760: 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c  sizeof("-journal
f770: 22 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  "));.  pPager->f
f780: 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50 61  d = fd;.  /* pPa
f790: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
f7a0: 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
f7b0: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  r->useJournal = 
f7c0: 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d  useJournal && !m
f7d0: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
f7e0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52  noReadlock = noR
f7f0: 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f  eadlock && readO
f800: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
f810: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20  ->stmtOpen = 0; 
f820: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f830: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a  stmtInUse = 0; *
f840: 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  /.  /* pPager->n
f850: 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  Ref = 0; */.  pP
f860: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d  ager->dbSize = m
f870: 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72  emDb-1;.  pPager
f880: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51 4c  ->pageSize = SQL
f890: 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
f8a0: 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61 67  _SIZE;.  /* pPag
f8b0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
f8c0: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
f8d0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b  ->stmtJSize = 0;
f8e0: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f8f0: 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20  >nPage = 0; */. 
f900: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
f910: 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d  = 100;.  pPager-
f920: 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45  >mxPgno = SQLITE
f930: 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b  _MAX_PAGE_COUNT;
f940: 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
f950: 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20  _UNLOCK==0 );.  
f960: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
f970: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
f980: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f990: 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
f9a0: 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
f9b0: 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
f9c0: 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
f9d0: 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
f9e0: 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
f9f0: 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
fa00: 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
fa10: 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
fa20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
fa30: 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
fa40: 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
fa50: 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
fa60: 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69  iveMode = tempFi
fa70: 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d  le; .  pPager->m
fa80: 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
fa90: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
faa0: 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
fab0: 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
fac0: 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
fad0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
fae0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
faf0: 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
fb00: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
fb10: 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
fb20: 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a 20 70  ync?0:1);.  /* p
fb30: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
fb40: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
fb50: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
fb60: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
fb70: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20  ger->pLast = 0; 
fb80: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78  */.  pPager->nEx
fb90: 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47  tra = FORCE_ALIG
fba0: 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20  NMENT(nExtra);. 
fbb0: 20 61 73 73 65 72 74 28 66 64 7c 7c 6d 65 6d 44   assert(fd||memD
fbc0: 62 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44 62  b);.  if( !memDb
fbd0: 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74 6f   ){.    setSecto
fbe0: 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
fbf0: 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e   }.  /* pPager->
fc00: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
fc10: 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74  ; */.  /* memset
fc20: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
fc30: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
fc40: 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20  ->aHash)); */.  
fc50: 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  *ppPager = pPage
fc60: 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  r;.#ifdef SQLITE
fc70: 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
fc80: 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67  ANAGEMENT.  pPag
fc90: 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64  er->pNext = pTsd
fca0: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64  ->pPager;.  pTsd
fcb0: 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
fcc0: 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  r;.#endif.  retu
fcd0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fce0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
fcf0: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
fd00: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
fd10: 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73  lite3PagerSetBus
fd20: 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
fd30: 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
fd40: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
fd50: 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
fd60: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
fd70: 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
fd80: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
fd90: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
fda0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
fdb0: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
fdc0: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
fdd0: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
fde0: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
fdf0: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
fe00: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
fe10: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
fe20: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
fe30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
fe40: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
fe50: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
fe60: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
fe70: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
fe80: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
fe90: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61  result sqlite3Pa
fea0: 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a  gerClose().  .**
feb0: 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65   Destructors are
fec0: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20   only called by 
fed0: 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
fee0: 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  f()..*/.void sql
fef0: 69 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74  ite3PagerSetDest
ff00: 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50  ructor(Pager *pP
ff10: 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65  ager, void (*xDe
ff20: 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  sc)(DbPage*,int)
ff30: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65  ){.  pPager->xDe
ff40: 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63  structor = xDesc
ff50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
ff60: 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
ff70: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
ff80: 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74    If not NULL, t
ff90: 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72  he reinitializer
ffa0: 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68  .** is called wh
ffb0: 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  en the content o
ffc0: 66 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68  f a page in cach
ffd0: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f  e is restored to
ffe0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   its original.**
fff0: 20 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75   value as a resu
10000 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b  lt of a rollback
10010 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  .  The callback 
10020 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76  gives higher-lev
10030 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70  el code.** an op
10040 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73  portunity to res
10050 74 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73  tore the EXTRA s
10060 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20  ection to agree 
10070 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65  with the restore
10080 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a  d.** page data..
10090 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
100a0 61 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28  agerSetReiniter(
100b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76  Pager *pPager, v
100c0 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44  oid (*xReinit)(D
100d0 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20  bPage*,int)){.  
100e0 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
100f0 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a  r = xReinit;.}..
10100 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61  /*.** Set the pa
10110 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e  ge size.  Return
10120 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20   the new size.  
10130 49 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e  If the suggest n
10140 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20  ew page.** size 
10150 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65  is inappropriate
10160 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e  , then an altern
10170 61 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20  ative page size 
10180 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61  is selected.** a
10190 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  nd returned..*/.
101a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
101b0 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
101c0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70  r *pPager, int p
101d0 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65  ageSize){.  asse
101e0 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  rt( pageSize>=51
101f0 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
10200 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
10210 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50  IZE );.  if( !pP
10220 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
10230 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
10240 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  {.    pager_rese
10250 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  t(pPager);.    p
10260 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10270 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
10280 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
10290 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61 6c 6c  e = sqlite3Reall
102a0 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65 72 2d  ocOrFree(pPager-
102b0 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61 67 65  >pTmpSpace, page
102c0 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Size);.  }.  ret
102d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65  urn pPager->page
102e0 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  Size;.}../*.** A
102f0 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
10300 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
10310 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
10320 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
10330 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
10340 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
10350 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
10360 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
10370 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
10380 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
10390 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
103a0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
103b0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
103c0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
103d0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
103e0 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
103f0 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
10400 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
10410 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
10420 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
10430 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
10440 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
10450 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
10460 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
10470 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
10480 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
10490 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
104a0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
104b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
104c0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
104d0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
104e0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
104f0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
10500 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
10510 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
10520 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
10530 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
10540 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
10550 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
10560 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
10570 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
10580 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
10590 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
105a0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
105b0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
105c0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
105d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
105e0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
105f0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
10600 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
10610 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
10620 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
10630 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
10640 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
10650 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
10660 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
10670 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
10680 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
10690 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
106a0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
106b0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
106c0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
106d0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
106e0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
106f0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
10700 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
10710 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
10720 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
10730 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
10740 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10750 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
10760 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
10770 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
10780 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
10790 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
107a0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
107b0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
107c0 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
107d0 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
107e0 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
107f0 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
10800 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
10810 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
10820 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
10830 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
10840 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
10850 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
10860 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
10870 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
10880 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
10890 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
108a0 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
108b0 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
108c0 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
108d0 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
108e0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
108f0 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
10900 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
10910 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
10920 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
10930 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
10940 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
10950 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
10960 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
10970 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
10980 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
10990 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
109a0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
109b0 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
109c0 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  {.    disable_si
109d0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
109e0 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
109f0 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66  OsSeek(pPager->f
10a00 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c  d, 0);.    enabl
10a10 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
10a20 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49 4f 54  rrors();.    IOT
10a30 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70 20  RACE(("DBHDR %p 
10a40 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  0 %d\n", pPager,
10a50 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71   N)).    rc = sq
10a60 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
10a70 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e  er->fd, pDest, N
10a80 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
10a90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
10aa0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
10ab0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
10ac0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
10ad0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10ae0 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c  Return the total
10af0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10b00 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   in the disk fil
10b10 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
10b20 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a  h.** pPager. .**
10b30 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44 49  .** If the PENDI
10b40 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e 20  NG_BYTE lies on 
10b50 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74 6c  the page directl
10b60 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  y after the end 
10b70 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20  of the.** file, 
10b80 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74 68  then consider th
10b90 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66 20  is page part of 
10ba0 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f  the file too. Fo
10bb0 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a  r example, if.**
10bc0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69 73   PENDING_BYTE is
10bd0 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65 20   byte 4096 (the 
10be0 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70 61  first byte of pa
10bf0 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73 69  ge 5) and the si
10c00 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c  ze of the.** fil
10c10 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73 2c  e is 4096 bytes,
10c20 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   5 is returned i
10c30 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a  nstead of 4..*/.
10c40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
10c50 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  Pagecount(Pager 
10c60 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
10c70 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  n;.  int rc;.  a
10c80 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
10c90 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
10ca0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
10cb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
10cc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
10cd0 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20  ize>=0 ){.    n 
10ce0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
10cf0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
10d00 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
10d10 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
10d20 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
10d30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10d40 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
10d50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
10d60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10d70 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
10d80 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  n<pPager->pageSi
10d90 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20  ze ){.      n = 
10da0 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
10db0 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d      n /= pPager-
10dc0 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d  >pageSize;.    }
10dd0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
10de0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
10df0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
10e00 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
10e10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
10e20 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59  ( n==(PENDING_BY
10e30 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
10e40 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b  ize) ){.    n++;
10e50 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61  .  }.  if( n>pPa
10e60 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
10e70 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
10e80 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74  o = n;.  }.  ret
10e90 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64  urn n;.}...#ifnd
10ea0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
10eb0 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c  EMORYDB./*.** Cl
10ec0 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20  ear a PgHistory 
10ed0 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20  block.*/.static 
10ee0 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72  void clearHistor
10ef0 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69  y(PgHistory *pHi
10f00 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65  st){.  sqliteFre
10f10 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b  e(pHist->pOrig);
10f20 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
10f30 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70  ist->pStmt);.  p
10f40 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b  Hist->pOrig = 0;
10f50 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  .  pHist->pStmt 
10f60 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  = 0;.}.#else.#de
10f70 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72  fine clearHistor
10f80 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  y(x).#endif../*.
10f90 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
10fa0 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
10fb0 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
10fc0 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a  (Pager*);../*.**
10fd0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
10fe0 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
10ff0 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
11000 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
11010 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
11020 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
11030 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
11040 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
11050 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
11060 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
11070 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
11080 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
11090 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
110a0 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
110b0 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
110c0 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
110d0 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
110e0 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
110f0 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
11100 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
11110 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
11120 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
11130 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
11140 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
11150 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
11160 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
11170 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
11180 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
11190 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
111a0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
111b0 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
111c0 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
111d0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
111e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
111f0 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e  ger->aHash[pPg->
11200 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
11210 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29  nHash-1)]!=pPg )
11220 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
11230 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
11240 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
11250 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
11260 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  nt h = pPg->pgno
11270 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
11280 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72  h-1);.    pPager
11290 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
112a0 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
112b0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
112c0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
112d0 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
112e0 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
112f0 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  }.  pPg->pgno = 
11300 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
11310 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
11320 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
11330 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
11340 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
11350 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
11360 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
11370 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
11380 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
11390 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
113a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
113b0 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
113c0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
113d0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
113e0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  ager;..  /* Keep
113f0 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65   the pFirstSynce
11400 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  d pointer pointi
11410 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ng at the first 
11420 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67  synchronized pag
11430 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d  e */.  if( pPg==
11440 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
11450 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
11460 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
11470 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65  tFree;.    while
11480 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
11490 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
114a0 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50  xtFree; }.    pP
114b0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
114c0 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = p;.  }..  /
114d0 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
114e0 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
114f0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
11500 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
11510 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
11520 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
11530 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
11540 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
11550 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
11560 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  ;.    pPager->pF
11570 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
11580 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28  tFree;.  }.  if(
11590 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
115a0 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
115b0 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
115c0 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
115d0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
115e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
115f0 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
11600 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
11610 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
11620 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
11630 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  xtFree = pPg->pP
11640 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  revFree = 0;..  
11650 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
11660 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
11670 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  le */.  unlinkHa
11680 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
11690 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPg);.}../*.** T
116a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
116b0 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  sed to truncate 
116c0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61  the cache when a
116d0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20   database.** is 
116e0 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70  truncated.  Drop
116f0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
11700 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
11710 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65  pgno is.** large
11720 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
11730 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
11740 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  eferenced..**.**
11750 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
11760 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
11770 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
11780 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41   zeroed..**.** A
11790 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20  ctually, at the 
117a0 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69  point this routi
117b0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ne is called, it
117c0 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20   would be.** an 
117d0 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20  error to have a 
117e0 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e  referenced page.
117f0 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61    But rather tha
11800 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74  n delete.** that
11810 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e   page and guaran
11820 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74  tee a subsequent
11830 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65   segfault, it se
11840 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f  ems better.** to
11850 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70   zero it and hop
11860 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20  e that we error 
11870 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73  out sanely..*/.s
11880 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
11890 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
118a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
118b0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
118c0 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
118d0 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
118e0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
118f0 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
11900 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
11910 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
11920 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
11930 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
11940 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
11950 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
11960 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
11970 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
11980 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
11990 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
119a0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
119b0 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
119c0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
119d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
119e0 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
119f0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52  tAll;.      IOTR
11a00 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
11a10 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
11a20 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
11a30 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
11a40 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
11a50 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
11a60 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
11a70 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
11a80 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pPg);.      sql
11a90 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
11aa0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67      pPager->nPag
11ab0 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  e--;.    }.  }.}
11ac0 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
11ad0 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
11ae0 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
11af0 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
11b00 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
11b10 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
11b20 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
11b30 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
11b40 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
11b50 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
11b60 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
11b70 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
11b80 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
11b90 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
11ba0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
11bb0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
11bc0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
11bd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
11be0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
11bf0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
11c00 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
11c10 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
11c20 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73  e OS lock values
11c30 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d   must be the sam
11c40 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20 6c  e as the Pager l
11c50 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  ock values */.  
11c60 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
11c70 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
11c80 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
11c90 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
11ca0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
11cb0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
11cc0 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
11cd0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  SIVE_LOCK );..  
11ce0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
11cf0 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f  s currently unlo
11d00 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73 69  cked then the si
11d10 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f  ze must be unkno
11d20 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  wn */.  assert( 
11d30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
11d40 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
11d50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 30 20  Pager->dbSize<0 
11d60 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20 20 69  || MEMDB );..  i
11d70 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
11d80 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
11d90 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11da0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
11db0 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
11dc0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
11dd0 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
11de0 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
11df0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
11e00 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  && sqlite3Invoke
11e10 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61 67  BusyHandler(pPag
11e20 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
11e30 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ) );.    if( rc=
11e40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11e50 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
11e60 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  e = locktype;.  
11e70 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
11e80 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
11e90 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
11ea0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
11eb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11ec0 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
11ed0 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
11ee0 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
11ef0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
11f00 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
11f10 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
11f20 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
11f30 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
11f40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
11f50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 4d  AGER_SHARED || M
11f60 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69 74 65  EMDB );.  sqlite
11f70 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
11f80 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
11f90 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
11fa0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
11fb0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
11fc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
11fd0 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
11fe0 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
11ff0 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
12000 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
12010 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
12020 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
12030 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
12040 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
12050 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
12060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12070 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  _OK;.  }.  rc = 
12080 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
12090 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
120a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
120b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
120c0 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c    /* Get an excl
120d0 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
120e0 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72  e database befor
120f0 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f  e truncating. */
12100 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61  .  rc = pager_wa
12110 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
12120 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
12130 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  K);.  if( rc!=SQ
12140 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
12150 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
12160 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
12170 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61  cate(pPager, nPa
12180 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
12190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
121a0 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
121b0 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
121c0 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
121d0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
121e0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
121f0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
12200 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
12210 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
12220 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
12230 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
12240 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
12250 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
12260 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
12270 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
12280 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
12290 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
122a0 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
122b0 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
122c0 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
122d0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
122e0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
122f0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
12300 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
12310 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
12320 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
12330 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
12340 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
12350 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
12360 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
12370 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
12380 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
12390 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
123a0 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
123b0 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
123c0 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
123d0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
123e0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
123f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12400 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70  erClose(Pager *p
12410 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 53  Pager){.#ifdef S
12420 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
12430 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
12440 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63   /* A malloc() c
12450 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71  annot fail in sq
12460 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
12470 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ) as one or more
12480 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20   calls to .  ** 
12490 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61  malloc() must ha
124a0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
124b0 6d 61 64 65 20 62 79 20 74 68 69 73 20 74 68 72  made by this thr
124c0 65 61 64 20 62 65 66 6f 72 65 20 69 74 20 67 65  ead before it ge
124d0 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20  ts.  ** to this 
124e0 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e  point. This mean
124f0 73 20 74 68 65 20 54 68 72 65 61 64 44 61 74 61  s the ThreadData
12500 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
12510 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64  allocated alread
12520 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54  y.  ** so that T
12530 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63  hreadData.nAlloc
12540 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20 20 2a   can be set..  *
12550 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61 20 2a  /.  ThreadData *
12560 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68  pTsd = sqlite3Th
12570 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73  readData();.  as
12580 73 65 72 74 28 20 70 50 61 67 65 72 20 29 3b 0a  sert( pPager );.
12590 20 20 61 73 73 65 72 74 28 20 70 54 73 64 20 26    assert( pTsd &
125a0 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63 20 29  & pTsd->nAlloc )
125b0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61  ;.#endif..  disa
125c0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
125d0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61  _errors();.  pPa
125e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30  ger->errCode = 0
125f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
12600 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20  usiveMode = 0;. 
12610 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
12620 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c  ger);.  pagerUnl
12630 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70  ockAndRollback(p
12640 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65  Pager);.  enable
12650 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
12660 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54  rors();.  PAGERT
12670 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c  RACE2("CLOSE %d\
12680 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
12690 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
126a0 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70  ("CLOSE %p\n", p
126b0 50 61 67 65 72 29 29 0a 20 20 61 73 73 65 72 74  Pager)).  assert
126c0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
126d0 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f  e || (pPager->jo
126e0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20  urnalOpen==0 && 
126f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
12700 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50  ==0) );.  if( pP
12710 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
12720 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  n ){.    sqlite3
12730 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
12740 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  >jfd);.  }.  sql
12750 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
12760 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  aInJournal);.  i
12770 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  f( pPager->stmtO
12780 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
12790 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
127a0 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a 20 20  r->stfd);.  }.  
127b0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
127c0 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 2f  pPager->fd);.  /
127d0 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72 65  * Temp files are
127e0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
127f0 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f 53  eleted by the OS
12800 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65 72  .  ** if( pPager
12810 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
12820 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  **   sqlite3OsDe
12830 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46 69  lete(pPager->zFi
12840 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a  lename);.  ** }.
12850 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c    */..#ifdef SQL
12860 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
12870 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
12880 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70 61 67  * Remove the pag
12890 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69 6e 6b  er from the link
128a0 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65 72  ed list of pager
128b0 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 0a 20  s starting at . 
128c0 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61 2e 70   ** ThreadData.p
128d0 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72 79 2d  Pager if memory-
128e0 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
128f0 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  abled..  */.  if
12900 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64 2d 3e  ( pPager==pTsd->
12910 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 70 54  pPager ){.    pT
12920 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
12930 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65  ger->pNext;.  }e
12940 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  lse{.    Pager *
12950 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28 70 54  pTmp;.    for(pT
12960 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61 67 65  mp = pTsd->pPage
12970 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 21 3d  r; pTmp->pNext!=
12980 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70 54 6d  pPager; pTmp=pTm
12990 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 20 20  p->pNext){}.    
129a0 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20 70 50  pTmp->pNext = pP
129b0 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  ager->pNext;.  }
129c0 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
129d0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
129e0 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  sh);.  sqliteFre
129f0 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  e(pPager->pTmpSp
12a00 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ace);.  sqliteFr
12a10 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ee(pPager);.  re
12a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12a30 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
12a40 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  NDEBUG) || defin
12a50 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
12a60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
12a70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
12a80 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
12a90 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
12aa0 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
12ab0 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b  mber(DbPage *p){
12ac0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e  .  return p->pgn
12ad0 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  o;.}.#endif../*.
12ae0 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28  ** The page_ref(
12af0 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65  ) function incre
12b00 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65  ments the refere
12b10 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
12b20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20  page..** If the 
12b30 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
12b40 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
12b50 74 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65  t (the reference
12b60 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20   count is zero) 
12b70 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69  then.** remove i
12b80 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  t from the freel
12b90 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e  ist..**.** For n
12ba0 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c  on-test systems,
12bb0 20 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61   page_ref() is a
12bc0 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c   macro that call
12bd0 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a  s _page_ref().**
12be0 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72   online of the r
12bf0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69  eference count i
12c00 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73  s zero.  For tes
12c10 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
12c20 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65  ref().** is a re
12c30 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74  al function so t
12c40 68 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62  hat we can set b
12c50 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74  reakpoints and t
12c60 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74  race it..*/.stat
12c70 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65  ic void _page_re
12c80 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  f(PgHdr *pPg){. 
12c90 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
12ca0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  0 ){.    /* The 
12cb0 70 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c  page is currentl
12cc0 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  y on the freelis
12cd0 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a  t.  Remove it. *
12ce0 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70  /.    if( pPg==p
12cf0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
12d00 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
12d10 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67    PgHdr *p = pPg
12d20 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
12d30 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
12d40 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20  ->needSync ){ p 
12d50 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20  = p->pNextFree; 
12d60 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
12d70 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12d80 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  d = p;.    }.   
12d90 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
12da0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
12db0 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
12dc0 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
12dd0 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  extFree;.    }el
12de0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
12df0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
12e00 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
12e10 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
12e20 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a  g->pNextFree ){.
12e30 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
12e40 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20  Free->pPrevFree 
12e50 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
12e60 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12e70 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
12e80 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72  pLast = pPg->pPr
12e90 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20  evFree;.    }.  
12ea0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e    pPg->pPager->n
12eb0 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67  Ref++;.  }.  pPg
12ec0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49  ->nRef++;.  REFI
12ed0 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64  NFO(pPg);.}.#ifd
12ee0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
12ef0 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
12f00 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
12f10 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  g){.    if( pPg-
12f20 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
12f30 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29    _page_ref(pPg)
12f40 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
12f50 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a     pPg->nRef++;.
12f60 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50        REFINFO(pP
12f70 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  g);.    }.  }.#e
12f80 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67  lse.# define pag
12f90 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d  e_ref(P)   ((P)-
12fa0 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72  >nRef==0?_page_r
12fb0 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d  ef(P):(void)(P)-
12fc0 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a  >nRef++).#endif.
12fd0 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74  ./*.** Increment
12fe0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
12ff0 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
13000 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e    The input poin
13010 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65  ter is.** a refe
13020 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
13030 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73  e data..*/.int s
13040 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44  qlite3PagerRef(D
13050 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70  bPage *pPg){.  p
13060 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
13070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
13090 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
130a0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
130b0 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
130c0 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
130d0 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
130e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
130f0 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
13100 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
13110 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
13120 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
13130 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
13140 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
13150 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
13160 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
13170 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
13180 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
13190 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
131a0 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
131b0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
131c0 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
131d0 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
131e0 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
131f0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
13200 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
13210 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
13220 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
13230 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
13240 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
13250 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
13260 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
13270 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
13280 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
13290 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
132a0 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
132b0 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
132c0 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
132d0 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
132e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
132f0 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
13300 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
13310 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
13320 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
13330 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
13340 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
13350 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
13360 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
13370 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
13380 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
13390 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
133a0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
133b0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
133c0 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
133d0 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
133e0 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
133f0 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
13400 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73  er failure, so s
13410 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
13420 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
13430 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
13440 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
13450 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
13460 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
13470 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13480 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
13490 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
134a0 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
134b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
134c0 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
134d0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
134e0 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
134f0 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
13500 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
13510 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
13520 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
13530 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
13540 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
13550 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
13560 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
13570 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
13580 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13590 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f  lOpen );.      /
135a0 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65  * assert( !pPage
135b0 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20  r->noSync ); // 
135c0 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20  noSync might be 
135d0 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  set if synchrono
135e0 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  us.      ** was 
135f0 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72  turned off after
13600 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
13610 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54   was started.  T
13620 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69  icket #615 */.#i
13630 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
13640 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
13650 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50  Make sure the pP
13660 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74  ager->nRec count
13670 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e  er we are keepin
13680 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20  g agrees.       
13690 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65   ** with the nRe
136a0 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
136b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
136c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
136d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
136e0 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20   i64 jSz;.      
136f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13700 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
13710 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20  >jfd, &jSz);.   
13720 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
13730 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13740 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
13750 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13760 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23  jSz );.      }.#
13770 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
13780 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
13790 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
137a0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
137b0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
137c0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
137d0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
137e0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
137f0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
13800 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
13810 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
13820 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
13830 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
13840 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
13850 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
13860 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
13870 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
13880 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ck. .        */.
13890 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
138a0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
138b0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
138c0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
138d0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
138e0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
138f0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
13900 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
13910 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
13920 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13930 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
13940 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  fd, 0);.        
13950 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
13960 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
13970 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
13980 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
13990 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20  ager->jfd,.     
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
139c0 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
139d0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
139e0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
139f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
13a00 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
13a10 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64  "JHDR %p %lld %d
13a20 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20 20 20  \n", pPager,.   
13a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
13a40 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
13a50 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  r + sizeof(aJour
13a60 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29 0a 20  nalMagic), 4)). 
13a70 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
13a80 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
13a90 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
13aa0 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
13ab0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
13ac0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13ad0 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
13ae0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
13af0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
13b00 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
13b10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13b20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  }.      PAGERTRA
13b30 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
13b40 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
13b50 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
13b60 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
13b70 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
13b80 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r)).      rc = s
13b90 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
13ba0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
13bb0 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
13bc0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
13bd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
13be0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13bf0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
13c00 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
13c10 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20  needSync = 0;.. 
13c20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65 20     /* Erase the 
13c30 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66 72  needSync flag fr
13c40 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a 20  om every page.. 
13c50 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50     */.    for(pP
13c60 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
13c70 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
13c80 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70  extAll){.      p
13c90 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
13ca0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
13cb0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
13cc0 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
13cd0 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  t;.  }..#ifndef 
13ce0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
13cf0 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
13d00 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  c flag is clear 
13d10 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e 6e  then the PgHdr.n
13d20 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61  eedSync.  ** fla
13d30 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 63  g must also be c
13d40 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61 67  lear for all pag
13d50 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  es.  Verify that
13d60 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72   this.  ** invar
13d70 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20 20  iant is true..  
13d80 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 66  */.  else{.    f
13d90 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
13da0 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
13db0 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
13dc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
13dd0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
13de0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
13df0 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
13e00 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
13e10 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65  pFirst );.  }.#e
13e20 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
13e30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72 67  c;.}../*.** Merg
13e40 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20 70  e two lists of p
13e50 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20 62  ages connected b
13e60 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e 20  y pDirty and in 
13e70 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20 44  pgno order..** D
13e80 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69 6e  o not both fixin
13e90 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74 79  g the pPrevDirty
13ea0 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73 74   pointers..*/.st
13eb0 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72 67  atic PgHdr *merg
13ec0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
13ed0 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42 29   *pA, PgHdr *pB)
13ee0 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c 74  {.  PgHdr result
13ef0 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61 69  , *pTail;.  pTai
13f00 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20 77  l = &result;.  w
13f10 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20 29  hile( pA && pB )
13f20 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 67  {.    if( pA->pg
13f30 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a 20  no<pB->pgno ){. 
13f40 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
13f50 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20 70  ty = pA;.      p
13f60 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20 20  Tail = pA;.     
13f70 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74 79   pA = pA->pDirty
13f80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13f90 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79     pTail->pDirty
13fa0 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54 61   = pB;.      pTa
13fb0 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  il = pB;.      p
13fc0 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b 0a  B = pB->pDirty;.
13fd0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
13fe0 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d  pA ){.    pTail-
13ff0 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20  >pDirty = pA;.  
14000 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b 0a  }else if( pB ){.
14010 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
14020 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65 7b  y = pB;.  }else{
14030 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
14040 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ty = 0;.  }.  re
14050 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69 72  turn result.pDir
14060 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 72  ty;.}../*.** Sor
14070 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61  t the list of pa
14080 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e 67  ges in accending
14090 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e 20   order by pgno. 
140a0 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f   Pages are.** co
140b0 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72 74  nnected by pDirt
140c0 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68 65  y pointers.  The
140d0 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69 6e   pPrevDirty poin
140e0 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72 72  ters are.** corr
140f0 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73 6f  upted by this so
14100 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  rt..*/.#define N
14110 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
14120 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e 5f  OC 25.#define N_
14130 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20 20  SORT_BUCKET     
14140 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c 49    25.#ifdef SQLI
14150 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73 71  TE_TEST.  int sq
14160 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
14170 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a 20  rt_bucket = 0;. 
14180 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f 42   #undef N_SORT_B
14190 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65 20  UCKET.  #define 
141a0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c 0a  N_SORT_BUCKET \.
141b0 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67 65     (sqlite3_page
141c0 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3f  r_n_sort_bucket?
141d0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
141e0 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53 4f  sort_bucket:N_SO
141f0 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 29  RT_BUCKET_ALLOC)
14200 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 50  .#endif.static P
14210 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c  gHdr *sort_pagel
14220 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b  ist(PgHdr *pIn){
14230 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f  .  PgHdr *a[N_SO
14240 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43 5d  RT_BUCKET_ALLOC]
14250 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  , *p;.  int i;. 
14260 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73 69   memset(a, 0, si
14270 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69 6c  zeof(a));.  whil
14280 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70 20  e( pIn ){.    p 
14290 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20 3d  = pIn;.    pIn =
142a0 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20   p->pDirty;.    
142b0 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  p->pDirty = 0;. 
142c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 5f     for(i=0; i<N_
142d0 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20 69  SORT_BUCKET-1; i
142e0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
142f0 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [i]==0 ){.      
14300 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20 20    a[i] = p;.    
14310 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
14320 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14330 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69  p = merge_pageli
14340 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20  st(a[i], p);.   
14350 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a 20       a[i] = 0;. 
14360 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14370 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f 42   if( i==N_SORT_B
14380 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20 20  UCKET-1 ){.     
14390 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54 6f   /* Coverage: To
143a0 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72 65   get here, there
143b0 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28 4e   need to be 2^(N
143c0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a 20  _SORT_BUCKET) . 
143d0 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74 73       ** elements
143e0 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c 69   in the input li
143f0 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73 73  st. This is poss
14400 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61 63  ible, but imprac
14410 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a 20  tical..      ** 
14420 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69 6e  Testing this lin
14430 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20 6f  e is the point o
14440 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  f global variabl
14450 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  e.      ** sqlit
14460 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f  e3_pager_n_sort_
14470 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a 2f  bucket..      */
14480 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d 65  .      a[i] = me
14490 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69  rge_pagelist(a[i
144a0 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ], p);.    }.  }
144b0 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20 66  .  p = a[0];.  f
144c0 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52 54  or(i=1; i<N_SORT
144d0 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a 20  _BUCKET; i++){. 
144e0 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
144f0 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b 0a  elist(p, a[i]);.
14500 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
14510 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
14520 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
14530 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
14540 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
14550 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
14560 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
14570 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
14580 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14590 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
145a0 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
145b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
145c0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
145d0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
145e0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
145f0 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
14600 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
14610 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14620 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
14630 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
14640 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
14650 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
14660 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
14670 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
14680 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
14690 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
146a0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
146b0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
146c0 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
146d0 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
146e0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
146f0 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
14700 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
14710 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
14720 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
14730 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
14740 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
14750 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
14760 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
14770 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
14780 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
14790 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
147a0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
147b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
147c0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
147d0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
147e0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
147f0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
14800 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
14810 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
14820 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
14830 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
14840 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
14850 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
14860 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
14870 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
14880 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
14890 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
148a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
148b0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
148c0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
148d0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
148e0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
148f0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
14900 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
14910 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
14920 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
14930 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
14940 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
14950 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
14960 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
14970 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
14980 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
14990 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
149a0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
149b0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
149c0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
149d0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
149e0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
149f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
14a00 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
14a10 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67  pList = sort_pag
14a20 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20  elist(pList);.  
14a30 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
14a40 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
14a50 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
14a60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
14a70 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  ek(pPager->fd, (
14a80 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28  pList->pgno-1)*(
14a90 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
14aa0 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Size);.    if( r
14ab0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14ac0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
14ad0 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69  re dirty pages i
14ae0 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
14af0 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65   with page numbe
14b00 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a  rs greater.    *
14b10 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53  * than Pager.dbS
14b20 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20  ize, this means 
14b30 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
14b40 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65  cate() was calle
14b50 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
14b60 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
14b70 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
14b80 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
14b90 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
14ba0 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
14bb0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
14bc0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
14bd0 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d  f( pList->pgno<=
14be0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
14bf0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 44  {.      char *pD
14c00 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ata = CODEC2(pPa
14c10 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
14c20 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
14c30 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20  ->pgno, 6);.    
14c40 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 53    PAGERTRACE4("S
14c50 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
14c60 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
14c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c80 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
14c90 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
14ca0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
14cb0 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20 49 4f  List));.      IO
14cc0 54 52 41 43 45 28 28 22 50 47 4f 55 54 20 25 70  TRACE(("PGOUT %p
14cd0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
14ce0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pList->pgno));. 
14cf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14d00 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
14d10 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67  >fd, pData, pPag
14d20 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14d30 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
14d40 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
14d50 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
14d60 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
14d70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
14d80 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
14d90 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
14da0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
14db0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
14dc0 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
14dd0 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
14de0 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
14df0 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
14e00 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
14e10 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
14e20 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
14e30 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
14e40 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
14e50 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
14e60 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
14e70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14e80 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
14e90 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
14ea0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
14eb0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
14ec0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
14ed0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
14ee0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
14ef0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
14f00 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14f10 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
14f20 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
14f30 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
14f40 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
14f50 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
14f60 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
14f70 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
14f80 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
14f90 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
14fa0 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
14fb0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
14fc0 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
14fd0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
14fe0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
14ff0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15000 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a  ->pDirty;.}../*.
15010 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
15020 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
15030 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
15040 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
15050 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
15060 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
15070 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
15080 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
15090 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
150a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
150b0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
150c0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
150d0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
150e0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
150f0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
15100 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
15110 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
15120 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
15130 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
15140 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
15150 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
15160 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
15170 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
15180 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
15190 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
151a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
151b0 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
151c0 6e 61 6c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  nal) ){.    retu
151d0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
151e0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
151f0 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65  servedLock(pPage
15200 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65  r->fd) ){.    re
15210 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
15220 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
15230 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
15240 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
15250 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
15260 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
15270 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
15280 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
15290 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
152a0 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
152b0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
152c0 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
152d0 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
152e0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
152f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
15300 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
15310 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
15320 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
15330 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
15340 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
15350 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15360 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
15370 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73 79 6e  *pPager, int syn
15380 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  cOk, PgHdr **ppP
15390 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
153a0 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b 0a 0a  ;.  *ppPg = 0;..
153b0 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44 42 29    assert(!MEMDB)
153c0 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61 20 70  ;..  /* Find a p
153d0 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20  age to recycle. 
153e0 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61   Try to locate a
153f0 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
15400 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  not.  ** require
15410 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
15420 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
15430 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  nal..  */.  pPg 
15440 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
15450 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66  Synced;..  /* If
15460 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69   we could not fi
15470 6e 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64  nd a page that d
15480 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
15490 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20  an fsync().  ** 
154a0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
154b0 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
154c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
154d0 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a    This is a.  **
154e0 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
154f0 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
15500 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
15510 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
15520 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20  s.  ** it can't 
15530 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a  be helped..  */.
15540 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20    if( pPg==0 && 
15550 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 26  pPager->pFirst &
15560 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d 45 4d  & syncOk && !MEM
15570 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  DB){.    int rc 
15580 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
15590 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
155a0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  c!=0 ){.      re
155b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
155c0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
155d0 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
155e0 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
155f0 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20  ync mode, write 
15600 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65  a new journal he
15610 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ader into the.  
15620 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
15630 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
15640 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
15650 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
15660 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68 65 61  nal.      ** hea
15670 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
15680 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
15690 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
156a0 61 74 20 68 61 76 65 0a 20 20 20 20 20 20 2a 2a  at have.      **
156b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
156c0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
156d0 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
156e0 68 65 20 68 65 61 64 65 72 20 69 73 0a 20 20 20  he header is.   
156f0 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68     ** trashed wh
15700 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
15710 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20  d is updated).. 
15720 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50       */.      pP
15730 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
15740 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15750 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15760 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 61 73   > 0 );.      as
15770 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
15780 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
15790 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
157a0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
157b0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
157c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
157d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
157e0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
157f0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
15800 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30    }.  if( pPg==0
15810 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15820 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
15830 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
15840 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
15850 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
15860 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15870 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
15880 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
15890 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
158a0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
158b0 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
158c0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
158d0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
158e0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
158f0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
15900 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
15910 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
15920 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 69  st( pPg );.    i
15930 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15940 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
15950 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
15960 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
15970 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  rty==0 );..  /* 
15980 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
15990 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
159a0 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
159b0 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
159c0 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
159d0 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
159e0 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
159f0 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  abling the.  ** 
15a00 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
15a10 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  Rollback() optim
15a20 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
15a30 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
15a40 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
15a50 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
15a60 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
15a70 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
15a80 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
15a90 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
15aa0 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
15ab0 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
15ac0 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
15ad0 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
15ae0 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
15af0 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
15b00 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
15b10 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
15b20 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
15b30 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
15b40 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
15b50 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
15b60 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
15b70 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49 4f 54  lback ){.    IOT
15b80 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f 52 4f  RACE(("ALWAYS_RO
15b90 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20 70 50  LLBACK %p\n", pP
15ba0 61 67 65 72 29 29 0a 20 20 20 20 70 50 61 67 65  ager)).    pPage
15bb0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
15bc0 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  k = 1;.  }..  /*
15bd0 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
15be0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
15bf0 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
15c00 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a 2f 0a  hash table.  */.
15c10 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
15c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
15c30 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a 20 20  ->pgno==0 );..  
15c40 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20 20 72  *ppPg = pPg;.  r
15c50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15c60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
15c70 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
15c80 64 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66  d to free superf
15c90 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c  luous dynamicall
15ca0 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  y allocated memo
15cb0 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68  ry.** held by th
15cc0 65 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20  e pager system. 
15cd0 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79  Memory in use by
15ce0 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65   any SQLite page
15cf0 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  r allocated.** b
15d00 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  y the current th
15d10 72 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69  read may be sqli
15d20 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a  teFree()ed..**.*
15d30 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75  * nReq is the nu
15d40 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
15d50 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64   memory required
15d60 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68  . Once this much
15d70 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c   has.** been rel
15d80 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74  eased, the funct
15d90 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41 20 6e  ion returns. A n
15da0 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 66 6f  egative value fo
15db0 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a 2a 20  r nReq means.** 
15dc0 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d 65 6d  free as much mem
15dd0 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65 2e  ory as possible.
15de0 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
15df0 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
15e00 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
15e10 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
15e20 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 20 64 65  eased..*/.#if de
15e30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
15e40 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
15e50 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69 6e  EMENT) && !defin
15e60 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
15e70 49 53 4b 49 4f 29 0a 69 6e 74 20 73 71 6c 69 74  ISKIO).int sqlit
15e80 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65  e3PagerReleaseMe
15e90 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a  mory(int nReq){.
15ea0 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61    const ThreadDa
15eb0 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c  ta *pTsdro = sql
15ec0 69 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65  ite3ThreadDataRe
15ed0 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e 74 20  adOnly();.  int 
15ee0 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20  nReleased = 0;. 
15ef0 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66   int i;..  /* If
15f00 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20   the the global 
15f10 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74  mutex is held, t
15f20 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62  his subroutine b
15f30 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d  ecomes a.  ** o-
15f40 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f  op; zero bytes o
15f50 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65  f memory are fre
15f60 65 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63  ed.  This is bec
15f70 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f  ause.  ** some o
15f80 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b  f the code invok
15f90 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
15fa0 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a  ion may also.  *
15fb0 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * try to obtain 
15fc0 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c  the mutex, resul
15fd0 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f  ting in a deadlo
15fe0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ck..  */.  if( s
15ff0 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28  qlite3OsInMutex(
16000 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  0) ){.    return
16010 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75   0;.  }..  /* Ou
16020 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e  termost loop run
16030 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77  s for at most tw
16040 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69  o iterations. Fi
16050 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65  rst iteration we
16060 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e  .  ** try to fin
16070 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61  d memory that ca
16080 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69  n be released wi
16090 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73  thout calling fs
160a0 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20  ync(). Second.  
160b0 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68  ** iteration (wh
160c0 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66  ich only runs if
160d0 20 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65   the first faile
160e0 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62  d to free nReq b
160f0 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d  ytes of.  ** mem
16100 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65  ory) is permitte
16110 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28  d to call fsync(
16120 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f  ). This is of co
16130 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a  urse much more .
16140 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a    ** expensive..
16150 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
16160 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20  i<=1; i++){..   
16170 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
16180 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20   all the SQLite 
16190 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79  pagers opened by
161a0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
161b0 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61 67 65  ead. */.    Page
161c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 54 73 64  r *pPager = pTsd
161d0 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  ro->pPager;.    
161e0 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20 26 26  for( ; pPager &&
161f0 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
16200 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 50 61  eased<nReq); pPa
16210 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
16220 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20  t){.      PgHdr 
16230 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  *pPg;.      int 
16240 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 4d  rc;..      if( M
16250 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
16260 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
16270 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72 20  }..      /* For 
16280 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79 20  each pager, try 
16290 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79 20  to free as many 
162a0 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62 6c  pages as possibl
162b0 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20 20  e (without .    
162c0 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79    ** calling fsy
162d0 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73 20  nc() if this is 
162e0 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61 74  the first iterat
162f0 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65 72  ion of the outer
16300 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c  most .      ** l
16310 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  oop)..      */. 
16320 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49       while( SQLI
16330 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67  TE_OK==(rc = pag
16340 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
16350 72 2c 20 69 2c 20 26 70 50 67 29 29 20 26 26 20  r, i, &pPg)) && 
16360 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  pPg) {.        /
16370 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20 61 20  * We've found a 
16380 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20 41 74  page to free. At
16390 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20   this point the 
163a0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 0a 20  page has been . 
163b0 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65         ** remove
163c0 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
163d0 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
163e0 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
163f0 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20 20 2a  -list .        *
16400 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29  * (pFirstSynced)
16410 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e  . It is still in
16420 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28   the all pages (
16430 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20  pAll) list. .   
16440 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69       ** Remove i
16450 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74  t from this list
16460 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e   before freeing.
16470 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
16480 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65      ** Todo: Che
16490 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74  ck the Pager.pSt
164a0 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20  mt list to make 
164b0 73 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e  sure this is Ok.
164c0 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   It .        ** 
164d0 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68 6f 75  probably is thou
164e0 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  gh..        */. 
164f0 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 54         PgHdr *pT
16500 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mp;.        asse
16510 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
16520 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67     if( pPg==pPag
16530 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
16540 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
16550 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
16560 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  All;.        }el
16570 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  se{.          fo
16580 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e  r( pTmp=pPager->
16590 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78  pAll; pTmp->pNex
165a0 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d  tAll!=pPg; pTmp=
165b0 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29  pTmp->pNextAll )
165c0 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d  {}.          pTm
165d0 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  p->pNextAll = pP
165e0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
165f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
16600 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69  Released += sqli
16610 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29  teAllocSize(pPg)
16620 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
16630 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64  E(("PGFREE %p %d
16640 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67  \n", pPager, pPg
16650 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
16660 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
16670 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
16680 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
16690 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
166a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
166b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
166c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  _OK ){.        /
166d0 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
166e0 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
166f0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
16700 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
16710 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e     ** journal in
16720 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29   pager_recycle()
16730 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e  . The error is n
16740 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  ot returned to t
16750 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  he .        ** c
16760 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20 66 75  aller of this fu
16770 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c  nction. Instead,
16780 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e 65   set the Pager.e
16790 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e  rrCode variable.
167a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
167b0 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65  error will be re
167c0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73  turned to the us
167d0 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20 69 6e  er (or users, in
167e0 20 74 68 65 20 63 61 73 65 20 0a 20 20 20 20 20   the case .     
167f0 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72 65     ** of a share
16800 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20 6f  d pager cache) o
16810 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72 20  f the pager for 
16820 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72 20  which the error 
16830 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20 20  occured..       
16840 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
16850 72 74 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53  rt( (rc&0xff)==S
16860 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c 20 72  QLITE_IOERR || r
16870 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  c==SQLITE_FULL )
16880 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
16890 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
168a0 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
168b0 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  );.        pager
168c0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
168d0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
168e0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
168f0 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
16900 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
16910 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
16920 47 45 4d 45 4e 54 20 26 26 20 21 53 51 4c 49 54  GEMENT && !SQLIT
16930 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
16940 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
16950 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
16960 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20   pPg out of the 
16970 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
16980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
16990 64 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70  dDbPage(Pager *p
169a0 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
169b0 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  g, Pgno pgno){. 
169c0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
169d0 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
169e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
169f0 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
16a00 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
16a10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16a20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16a30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
16a40 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
16a50 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
16a60 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 0a 20  _TO_DATA(pPg),. 
16a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a80 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
16a90 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
16aa0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
16ab0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
16ac0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
16ad0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
16ae0 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
16af0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
16b00 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
16b10 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ;.  if( pgno==1 
16b20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  ){.    memcpy(&p
16b30 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
16b40 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f  s, &((u8*)PGHDR_
16b50 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34  TO_DATA(pPg))[24
16b60 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
16b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b90 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
16ba0 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
16bb0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
16bc0 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
16bd0 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
16be0 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41  , 3);.  PAGERTRA
16bf0 43 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61  CE4("FETCH %d pa
16c00 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
16c10 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
16c20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
16c30 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
16c40 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
16c50 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Pg));.  return r
16c60 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
16c70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
16c80 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  lled to obtain t
16c90 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72  he shared lock r
16ca0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a  equired before.*
16cb0 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65  * data may be re
16cc0 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
16cd0 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
16ce0 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20  shared lock has 
16cf0 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
16d00 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66  obtained, this f
16d10 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
16d20 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69  op..**.** Immedi
16d30 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
16d40 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  ining the shared
16d50 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72   lock (if requir
16d60 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ed), this functi
16d70 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72  on.** checks for
16d80 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
16d90 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  ile. If one is f
16da0 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e  ound, an emergen
16db0 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69  cy rollback.** i
16dc0 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65  s performed imme
16dd0 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  diately..*/.stat
16de0 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72  ic int pagerShar
16df0 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
16e00 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
16e10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
16e20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
16e30 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
16e40 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  ){.    if( !MEMD
16e50 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  B ){.      asser
16e60 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  t( pPager->nRef=
16e70 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
16e80 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c  !pPager->noReadl
16e90 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ock ){.        r
16ea0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
16eb0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53  n_lock(pPager, S
16ec0 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
16ed0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16ee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16ef0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
16f00 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
16f10 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c);.        }.  
16f20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16f30 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41  ager->state>=SHA
16f40 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
16f50 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
16f60 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  If a journal fil
16f70 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68  e exists, and th
16f80 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56  ere is no RESERV
16f90 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  ED lock on the. 
16fa0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
16fb0 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65   file, then it e
16fc0 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62  ither needs to b
16fd0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72  e played back or
16fe0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 20 20   deleted..      
16ff0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68 61 73  */.      if( has
17000 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
17010 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  r) ){.        /*
17020 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
17030 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
17040 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
17050 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
17060 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f  .        ** impo
17070 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53  rtant that a RES
17080 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f  ERVED lock is no
17090 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  t obtained on th
170a0 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20  e way to the.   
170b0 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
170c0 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
170d0 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
170e0 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
170f0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  he.        ** da
17100 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
17110 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
17120 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
17130 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
17140 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
17150 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
17160 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
17170 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
17180 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
17190 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20   ** back..      
171a0 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a    ** .        **
171b0 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
171c0 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
171d0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
171e0 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
171f0 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
17200 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
17210 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
17220 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
17230 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  ail to.        *
17240 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77  * obtain it's ow
17250 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
17260 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
17270 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
17280 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  /.        rc = s
17290 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
172a0 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
172b0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
172c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
172d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
172e0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
172f0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
17300 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
17310 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
17320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17330 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
17340 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
17350 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a  VE;. .        /*
17360 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
17370 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  l for reading on
17380 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ly.  Return SQLI
17390 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
173a0 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
173b0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
173c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
173d0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
173e0 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    ** The journal
173f0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e   file does not n
17400 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  eed to be locked
17410 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20   itself.  The.  
17420 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
17430 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
17440 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
17450 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
17460 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20  e holds.        
17470 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c  ** a write lock,
17480 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76   so there is nev
17490 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66  er any chance of
174a0 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20   two or more.   
174b0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
174c0 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
174d0 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
174e0 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  e time..        
174f0 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68 65 20  **..** Open the 
17500 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
17510 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e 20 54  /write access. T
17520 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 69  his is because i
17530 6e 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69 76 65  n ..** exclusive
17540 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65  -access mode the
17550 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
17560 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70   will be kept op
17570 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  en and.        *
17580 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65 64 20  * possibly used 
17590 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
175a0 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e 20 73  n later on. On s
175b0 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74 68 65  ome systems, the
175c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73 54 72  .        ** OsTr
175d0 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20 75 73  uncate() call us
175e0 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  ed in exclusive-
175f0 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c 73 6f  access mode also
17600 20 72 65 71 75 69 72 65 73 0a 20 20 20 20 20 20   requires.      
17610 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69 74    ** a read/writ
17620 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a 20  e file handle.. 
17630 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17640 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17650 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  SY;.        if( 
17660 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
17670 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
17680 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  rnal) ){.       
17690 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20 20 20     int ro;.     
176a0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
176b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
176c0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
176d0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
176e0 61 64 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  adWrite(pPager->
176f0 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
17700 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a 20 20  r->jfd, &ro);.  
17710 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17720 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
17730 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29 3b 0a   pPager->jfd );.
17740 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 6f            if( ro
17750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17760 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
17770 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
17780 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
17790 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
177a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
177b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
177c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
177d0 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
177e0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
177f0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17800 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
17810 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
17820 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
17830 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
17840 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
17850 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
17860 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
17870 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
17880 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
17890 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
178a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
178b0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20  alHdr = 0;. .   
178c0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
178d0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
178e0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
178f0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
17900 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  e.        ** loc
17910 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
17920 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
17930 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17940 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
17950 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
17960 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17970 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17980 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
17990 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
179a0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
179b0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
179c0 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  t(pPager->state=
179d0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
179e0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
179f0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
17a00 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
17a10 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
17a20 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ED).        );. 
17a30 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
17a40 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ( pPager->pAll )
17a50 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
17a60 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68 61 73   shared-lock has
17a70 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71 75 69   just been acqui
17a80 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62  red on the datab
17a90 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20 20 20  ase file.       
17aa0 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
17ab0 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
17ac0 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
17ad0 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
17ae0 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72        ** read or
17af0 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
17b00 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73  on).  Check to s
17b10 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ee if the databa
17b20 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 68 61  se.        ** ha
17b30 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e  s been modified.
17b40 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
17b50 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66  e has changed, f
17b60 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 20  lush the.       
17b70 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20 20 20   ** cache..     
17b80 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
17b90 20 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65   Database change
17ba0 73 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79  s is detected by
17bb0 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62   looking at 15 b
17bc0 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20  ytes beginning. 
17bd0 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66         ** at off
17be0 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68 65 20  set 24 into the 
17bf0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72 73 74  file.  The first
17c00 20 34 20 6f 66 20 74 68 65 73 65 20 31 36 20 62   4 of these 16 b
17c10 79 74 65 73 20 61 72 65 0a 20 20 20 20 20 20 20  ytes are.       
17c20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63 6f 75   ** a 32-bit cou
17c30 6e 74 65 72 20 74 68 61 74 20 69 73 20 69 6e 63  nter that is inc
17c40 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20 65 61  remented with ea
17c50 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68 65 0a  ch change.  The.
17c60 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72          ** other
17c70 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
17c80 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
17c90 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
17ca0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63  n.        ** a c
17cb0 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a  odec is in use..
17cc0 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20          ** .    
17cd0 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
17ce0 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d  a vanishingly sm
17cf0 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61 74 20  all chance that 
17d00 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f  a change will no
17d10 74 20 62 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  t be .        **
17d20 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65 20   detected.  The 
17d30 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e 64  chance of an und
17d40 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20 69  etected change i
17d50 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74 0a  s so small that.
17d60 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
17d70 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a  n be neglected..
17d80 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
17d90 20 20 20 63 68 61 72 20 64 62 46 69 6c 65 56 65     char dbFileVe
17da0 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67 65 72  rs[sizeof(pPager
17db0 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d 3b 0a  ->dbFileVers)];.
17dc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
17dd0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
17de0 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 20 20  ager);..        
17df0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
17e00 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ode ){.         
17e10 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
17e20 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
17e30 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
17e40 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
17e50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 49 4f   ){.          IO
17e60 54 52 41 43 45 28 28 22 43 4b 56 45 52 53 20 25  TRACE(("CKVERS %
17e70 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
17e80 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
17e90 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  rs)));.         
17ea0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
17eb0 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
17ec0 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  24);.          i
17ed0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17ee0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
17ef0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17f00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17f10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
17f20 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ead(pPager->fd, 
17f30 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a  &dbFileVers, siz
17f40 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
17f50 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
17f60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
17f80 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
17f90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
17fa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
17fb0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
17fc0 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
17fd0 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20  Vers));.        
17fe0 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  }..        if( m
17ff0 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
18000 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
18010 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
18020 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
18030 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
18040 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
18050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
18060 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18070 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  t( pPager->exclu
18080 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
18090 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52  er->state<=PAGER
180a0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
180b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
180c0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
180d0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
180e0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
180f0 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ARED;.    }.  }.
18100 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18110 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
18120 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20  a PgHdr object. 
18130 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20    Either create 
18140 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75  a new one or reu
18150 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  se.** an existin
18160 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f  g one that is no
18170 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  t otherwise in u
18180 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  se..**.** A new 
18190 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20  PgHdr structure 
181a0 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e  is created if an
181b0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
181c0 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a  ng are.** true:.
181d0 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
181e0 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65  e have not excee
181f0 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20  ded our maximum 
18200 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20  allocated cache 
18210 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
18220 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22   as set by the "
18230 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
18240 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  e" command..**.*
18250 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
18260 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50   are no unused P
18270 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61  gHdr objects ava
18280 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74  ilable at this t
18290 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ime..**.**     (
182a0 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69  3)  This is an i
182b0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
182c0 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29  e..**.**     (4)
182d0 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50    There are no P
182e0 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61  gHdr objects tha
182f0 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  t do not require
18300 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20   a journal.**   
18310 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63         file sync
18320 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74   and a sync of t
18330 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
18340 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
18350 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69           prohibi
18360 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ted..**.** Other
18370 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65  wise, reuse an e
18380 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20  xisting PgHdr.  
18390 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
183a0 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73  reuse an.** exis
183b0 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c  ting PgHdr if al
183c0 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
183d0 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
183e0 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
183f0 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65  ave reached or e
18400 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69  xceeded the maxi
18410 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  mum cache size.*
18420 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77  *          allow
18430 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61  ed by "PRAGMA ca
18440 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a  che_size"..**.**
18450 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
18460 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c  is a PgHdr avail
18470 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d  able with PgHdr-
18480 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20  >nRef==0.**.**  
18490 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e     (3)  We are n
184a0 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ot in an in-memo
184b0 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  ry database.**.*
184c0 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65  *     (4)  Eithe
184d0 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76  r there is an av
184e0 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68  ailable PgHdr th
184f0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
18500 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20  .**          to 
18510 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  be synced to dis
18520 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73  k or else disk s
18530 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e  yncing is curren
18540 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  tly.**          
18550 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74  allowed..*/.stat
18560 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f  ic int pagerAllo
18570 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a  catePage(Pager *
18580 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a  pPager, PgHdr **
18590 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  ppPg){.  int rc 
185a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
185b0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a  gHdr *pPg;..  /*
185c0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67   Create a new Pg
185d0 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68  Hdr if any of th
185e0 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e  e four condition
185f0 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20  s defined .  ** 
18600 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20 2a 2f  above is met: */
18610 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
18620 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
18630 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65 72  age.   || pPager
18640 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20  ->pFirst==0 .   
18650 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28  || MEMDB.   || (
18660 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
18670 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65  nced==0 && pPage
18680 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20  r->doNotSync).  
18690 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
186a0 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65 72  r->nPage>=pPager
186b0 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20 20  ->nHash ){.     
186c0 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61   pager_resize_ha
186d0 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65 72 2c  sh_table(pPager,
186e0 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
186f0 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35  ->nHash<256 ? 25
18700 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73  6 : pPager->nHas
18710 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  h*2);.      if( 
18720 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d 30  pPager->nHash==0
18730 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
18740 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
18750 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65         goto page
18760 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a  r_allocate_out;.
18770 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18780 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
18790 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
187a0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
187b0 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
187e0 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
187f0 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
18800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18810 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
18820 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
18830 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
18840 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
18850 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
18860 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
18870 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
18880 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
18890 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
188a0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
188b0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
188c0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
188d0 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
188e0 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
188f0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70      }.    pPg->p
18900 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
18910 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
18920 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
18930 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41  ;.    pPager->pA
18940 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50  ll = pPg;.    pP
18950 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20  ager->nPage++;. 
18960 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52   }else{.    /* R
18970 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73 74 69  ecycle an existi
18980 6e 67 20 70 61 67 65 20 77 69 74 68 20 61 20 7a  ng page with a z
18990 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a  ero ref-count. *
189a0 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
189b0 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c  _recycle(pPager,
189c0 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69   1, &pPg);.    i
189d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
189e0 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  SY ){.      rc =
189f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
18a00 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  OCKED;.    }.   
18a10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18a20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
18a30 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
18a40 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
18a50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
18a60 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
18a70 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
18a80 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
18a90 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
18aa0 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
18ab0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18ac0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
18ad0 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e   have the conten
18ae0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
18af0 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  f the page was.*
18b00 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  * previously acq
18b10 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
18b20 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68  tent==1, then th
18b30 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a  e content was.**
18b40 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   just initialize
18b50 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65  d to zeros inste
18b60 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ad of being read
18b70 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42   from disk..** B
18b80 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74  ut now we need t
18b90 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66  he real data off
18ba0 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61   of disk.  So ma
18bb0 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61  ke sure we.** ha
18bc0 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20  ve it.  Read it 
18bd0 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  in if we do not 
18be0 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e  have it already.
18bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18c00 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
18c10 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
18c20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  if( pPg->needRea
18c30 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  d ){.    int rc 
18c40 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
18c50 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
18c60 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
18c70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18c80 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   ){.      pPg->n
18c90 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
18ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
18cb0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
18cc0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18cd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
18ce0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
18cf0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
18d00 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
18d10 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
18d20 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
18d30 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
18d40 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
18d50 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
18d60 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
18d70 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
18d80 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18d90 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
18da0 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
18db0 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
18dc0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
18dd0 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
18de0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
18df0 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
18e00 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
18e10 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
18e20 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
18e30 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
18e40 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
18e50 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
18e60 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
18e70 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
18e80 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
18e90 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
18ea0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
18eb0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
18ec0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
18ed0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
18ee0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
18ef0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
18f00 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
18f10 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
18f20 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
18f30 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
18f40 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
18f50 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
18f60 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
18f70 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
18f80 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
18f90 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
18fa0 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
18fb0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
18fc0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
18fd0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
18fe0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
18ff0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
19000 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
19010 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
19020 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
19030 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
19040 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
19050 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
19060 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
19070 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
19080 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
19090 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
190a0 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
190b0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
190c0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
190d0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
190e0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
190f0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
19100 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
19110 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
19120 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
19130 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
19140 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
19150 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
19160 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
19170 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
19180 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
19190 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
191a0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
191b0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
191c0 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
191d0 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
191e0 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
191f0 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
19200 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
19210 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
19220 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
19230 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
19240 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
19250 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
19260 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
19270 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
19280 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
19290 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
192a0 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
192b0 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
192c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
192d0 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
192e0 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
192f0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
19300 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
19310 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
19320 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
19330 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
19340 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  t point..*/.int 
19350 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
19360 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
19370 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
19380 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
19390 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
193a0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
193b0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
193c0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
193d0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
193e0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
193f0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
19400 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
19410 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
19420 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
19430 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
19440 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
19450 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
19460 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
19470 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
19480 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
19490 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
194a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
194b0 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
194c0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
194d0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
194e0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
194f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
19500 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
19510 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
19520 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
19530 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
19540 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
19550 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
19560 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
19570 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
19580 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
19590 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
195a0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
195b0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
195c0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
195d0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
195e0 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
195f0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
19600 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
19610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
19620 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
19630 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
19640 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
19650 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
19660 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  de;.  }..  /* If
19670 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
19680 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
19690 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
196a0 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
196b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
196c0 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
196d0 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
196e0 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
196f0 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
19700 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
19710 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
19720 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
19730 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19740 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
19750 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
19760 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19770 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
19780 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
19790 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
197a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
197b0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
197c0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
197d0 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
197e0 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
197f0 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
19800 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45   int h;.    PAGE
19810 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
19820 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  Miss);.    rc = 
19830 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
19840 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b  e(pPager, &pPg);
19850 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
19860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
19870 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19880 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  ..    pPg->pgno 
19890 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  = pgno;.    asse
198a0 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67  rt( !MEMDB || pg
198b0 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  no>pPager->stmtS
198c0 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ize );.    if( p
198d0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
198e0 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
198f0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
19900 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
19910 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70  te3CheckMemory(p
19920 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
19930 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20  l, pgno/8);.    
19940 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19950 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
19960 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
19970 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
19980 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
19990 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
199a0 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70  7)))!=0;.      p
199b0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
199c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
199d0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
199e0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
199f0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
19a00 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43      }..    makeC
19a10 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70  lean(pPg);.    p
19a20 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
19a30 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
19a40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
19a50 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61  f++;.    if( pPa
19a60 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b  ger->nExtra>0 ){
19a70 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
19a80 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
19a90 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50  , pPager), 0, pP
19aa0 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20  ager->nExtra);. 
19ab0 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20     }.    nMax = 
19ac0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19ad0 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
19ae0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
19af0 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
19b00 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
19b10 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 72 63  f(pPg);.      rc
19b20 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
19b30 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  de;.      return
19b40 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
19b50 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  /* Populate the 
19b60 70 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20  page with data, 
19b70 65 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e  either by readin
19b80 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  g from the datab
19b90 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c  ase.    ** file,
19ba0 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74   or by setting t
19bb0 68 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74  he entire page t
19bc0 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20  o zero..    */. 
19bd0 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74     if( nMax<(int
19be0 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c  )pgno || MEMDB |
19bf0 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20  | (noContent && 
19c00 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52  !pPager->alwaysR
19c10 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20  ollback) ){.    
19c20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65    if( pgno>pPage
19c30 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20  r->mxPgno ){.   
19c40 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
19c50 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20  rUnref(pPg);.   
19c60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
19c70 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d  TE_FULL;.      }
19c80 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
19c90 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
19ca0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
19cb0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50  eSize);.      pP
19cc0 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f  g->needRead = no
19cd0 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67  Content && !pPag
19ce0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
19cf0 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ck;.      IOTRAC
19d00 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e  E(("ZERO %p %d\n
19d10 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  ", pPager, pgno)
19d20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19d30 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
19d40 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c  age(pPager, pPg,
19d50 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66   pgno);.      if
19d60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19d70 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f  && rc!=SQLITE_IO
19d80 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
19d90 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  {.        pPg->p
19da0 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  gno = 0;.       
19db0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
19dc0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
19dd0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
19de0 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e    }.      pPg->n
19df0 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
19e00 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20   }..    /* Link 
19e10 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
19e20 65 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c  e page hash tabl
19e30 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e  e */.    h = pgn
19e40 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
19e50 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72  sh-1);.    asser
19e60 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20  t( pgno!=0 );.  
19e70 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
19e80 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
19e90 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
19ea0 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
19eb0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
19ec0 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
19ed0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
19ee0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
19ef0 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
19f00 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
19f10 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
19f20 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51      }..#ifdef SQ
19f30 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
19f40 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61  .    pPg->pageHa
19f50 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68  sh = pager_pageh
19f60 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66  ash(pPg);.#endif
19f70 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19f80 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
19f90 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61  age is in the pa
19fa0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
19fb0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
19fc0 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d  nRef>0 || pgno==
19fd0 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e  1);.    PAGER_IN
19fe0 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29  CR(pPager->nHit)
19ff0 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e  ;.    if( !noCon
1a000 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63  tent ){.      rc
1a010 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e   = pager_get_con
1a020 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20  tent(pPg);.     
1a030 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1a040 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a050 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a060 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
1a070 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70   }.  *ppPage = p
1a080 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  Pg;.  return SQL
1a090 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1a0a0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 20   Acquire a page 
1a0b0 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64 79  if it is already
1a0c0 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1a0d0 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20  y cache.  Do.** 
1a0e0 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61 67  not read the pag
1a0f0 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65  e from disk.  Re
1a100 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
1a110 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f  o the page,.** o
1a120 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65 20  r 0 if the page 
1a130 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e  is not in cache.
1a140 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1a150 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
1a160 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e  ).  The differen
1a170 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
1a180 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73  routine.** and s
1a190 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1a1a0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
1a1b0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
1a1c0 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
1a1d0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
1a1e0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
1a1f0 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
1a200 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
1a210 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
1a220 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1a230 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
1a240 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
1a250 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
1a260 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61  appened..*/.DbPa
1a270 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ge *sqlite3Pager
1a280 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  Lookup(Pager *pP
1a290 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
1a2a0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1a2b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a2c0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1a2d0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20  ( pgno!=0 );..  
1a2e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1a2f0 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
1a300 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  ){.    assert( !
1a310 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20  pPager->pAll || 
1a320 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
1a330 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72 65 74  eMode );.    ret
1a340 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
1a350 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1a360 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1a370 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1a380 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
1a390 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61  ;.  }.  pPg = pa
1a3a0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1a3b0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1a3c0 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pPg==0 ) return 
1a3d0 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50  0;.  page_ref(pP
1a3e0 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g);.  return pPg
1a3f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
1a400 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
1a410 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
1a420 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1a430 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
1a440 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
1a450 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
1a460 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
1a470 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
1a480 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
1a490 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
1a4a0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
1a4b0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
1a4c0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1a4d0 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
1a4e0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
1a4f0 33 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61  3PagerUnref(DbPa
1a500 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f 2a 20  ge *pPg){..  /* 
1a510 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
1a520 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
1a530 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
1a540 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1a550 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d  nRef>0 );.  pPg-
1a560 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e  >nRef--;.  REFIN
1a570 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43  FO(pPg);..  CHEC
1a580 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20  K_PAGE(pPg);..  
1a590 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62  /* When the numb
1a5a0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
1a5b0 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68   to a page reach
1a5c0 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a   0, call the.  *
1a5d0 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64  * destructor and
1a5e0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f   add the page to
1a5f0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20   the freelist.. 
1a600 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e   */.  if( pPg->n
1a610 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  Ref==0 ){.    Pa
1a620 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
1a630 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70   pPager = pPg->p
1a640 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e  Pager;.    pPg->
1a650 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20  pNextFree = 0;. 
1a660 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
1a670 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  e = pPager->pLas
1a680 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  t;.    pPager->p
1a690 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Last = pPg;.    
1a6a0 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
1a6b0 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
1a6c0 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
1a6d0 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20  tFree = pPg;.   
1a6e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
1a6f0 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
1a700 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
1a710 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
1a720 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46  =0 && pPager->pF
1a730 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b  irstSynced==0 ){
1a740 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
1a750 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
1a760 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
1a770 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
1a780 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
1a790 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
1a7a0 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
1a7b0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1a7c0 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
1a7d0 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
1a7e0 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
1a7f0 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
1a800 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
1a810 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
1a820 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1a830 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
1a840 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1a850 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
1a860 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
1a870 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
1a880 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
1a890 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1a8a0 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61  f>0) ){.      pa
1a8b0 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
1a8c0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1a8d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a8e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a8f0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f  *.** Create a jo
1a900 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
1a910 50 61 67 65 72 2e 20 20 54 68 65 72 65 20 73 68  Pager.  There sh
1a920 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20  ould already be 
1a930 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72  a RESERVED.** or
1a940 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1a950 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1a960 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  file when this r
1a970 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1a980 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
1a990 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
1a9a0 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20  ything.  Return 
1a9b0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  an error code an
1a9c0 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a  d release the.**
1a9d0 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61   write lock if a
1a9e0 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
1a9f0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1aa00 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  t pager_open_jou
1aa10 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
1aa20 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1aa30 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
1aa40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1aa50 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1aa60 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1aa70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1aa80 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
1aa90 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1aaa0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1aab0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1aac0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->aInJournal==
1aad0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  0 );.  sqlite3Pa
1aae0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
1aaf0 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
1ab00 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
1ab10 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
1ab20 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
1ab30 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1ab40 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1ab50 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1ab60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
1ab70 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1ab80 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1ab90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
1aba0 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
1abb0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
1abc0 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20 20  Pager->jfd,.    
1abd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abe0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
1abf0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
1ac00 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
1ac10 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65  LITE_OK || pPage
1ac20 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50 61 67  r->jfd );.  pPag
1ac30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
1ac40 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
1ac50 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
1ac60 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1ac70 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
1ac80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1ac90 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1aca0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20  _NOMEM ){.      
1acb0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
1acc0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1acd0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  );.    }.    got
1ace0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
1acf0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
1ad00 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75 6c 6c  sqlite3OsSetFull
1ad10 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
1ad20 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66  , pPager->full_f
1ad30 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  sync);.  sqlite3
1ad40 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
1ad50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1ad60 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20  ->full_fsync);. 
1ad70 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
1ad80 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
1ad90 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69  jfd, pPager->zDi
1ada0 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67  rectory);.  pPag
1adb0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1adc0 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  = 1;.  pPager->j
1add0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
1ade0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  0;.  pPager->nee
1adf0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61  dSync = 0;.  pPa
1ae00 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1ae10 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ack = 0;.  pPage
1ae20 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69  r->nRec = 0;.  i
1ae30 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1ae40 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  de ){.    rc = p
1ae50 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1ae60 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
1ae70 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
1ae80 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
1ae90 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
1aea0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
1aeb0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1aec0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
1aed0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
1aee0 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
1aef0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1af00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1af10 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
1af20 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
1af30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
1af40 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc!=SQLITE_NOMEM
1af50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
1af60 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
1af70 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
1af80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1af90 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1afa0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
1afb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1afc0 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
1afd0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
1afe0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
1aff0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
1b000 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1b010 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nal = 0;.  retur
1b020 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1b030 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
1b040 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1b050 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
1b060 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
1b070 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
1b080 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
1b090 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
1b0a0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1b0b0 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61  PhaseTwo() is ca
1b0c0 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
1b0d0 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
1b0e0 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
1b0f0 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
1b100 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63  agerClose() is c
1b110 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
1b120 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1b130 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
1b140 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
1b150 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
1b160 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
1b170 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
1b180 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
1b190 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
1b1a0 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
1b1b0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
1b1c0 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
1b1d0 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
1b1e0 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
1b1f0 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
1b200 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
1b210 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
1b220 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
1b230 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
1b240 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
1b250 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
1b260 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
1b270 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
1b280 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
1b290 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
1b2a0 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
1b2b0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1b2c0 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
1b2d0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
1b2e0 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
1b2f0 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
1b300 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
1b310 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
1b320 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
1b330 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
1b340 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
1b350 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
1b360 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
1b370 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
1b380 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
1b390 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
1b3a0 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
1b3b0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1b3c0 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
1b3d0 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
1b3e0 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
1b3f0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
1b400 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
1b410 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
1b420 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
1b430 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
1b440 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
1b450 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
1b460 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
1b470 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
1b480 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
1b490 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
1b4a0 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
1b4b0 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
1b4c0 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
1b4d0 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
1b4e0 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50  e3PagerBegin(DbP
1b4f0 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78  age *pPg, int ex
1b500 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  Flag){.  Pager *
1b510 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1b520 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
1b530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
1b540 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
1b550 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1b560 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1b570 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
1b580 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1b590 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
1b5a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b5b0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b5c0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
1b5d0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
1b5e0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1b5f0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
1b600 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
1b610 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
1b620 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d  r->dbSize;.    }
1b630 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1b640 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1b650 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
1b660 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
1b670 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b680 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
1b690 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1b6a0 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
1b6b0 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
1b6c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1b6d0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1b6e0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1b6f0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
1b700 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1b710 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1b720 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b730 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
1b750 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1b760 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52  = 0;.      PAGER
1b770 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54  TRACE2("TRANSACT
1b780 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ION %d\n", PAGER
1b790 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1b7a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75     if( pPager->u
1b7b0 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50  seJournal && !pP
1b7c0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
1b7d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1b7e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1b7f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1b800 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
1b810 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1b820 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1b830 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
1b840 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1b850 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 74 68   happens when th
1b860 65 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65  e pager was in e
1b870 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1b880 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a  mode last.    **
1b890 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
1b8a0 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
1b8b0 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
1b8c0 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
1b8d0 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
1b8e0 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
1b8f0 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
1b900 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
1b910 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
1b920 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72 75 6e  pt open and trun
1b930 63 61 74 65 64 20 74 6f 20 30 20 62 79 74 65 73  cated to 0 bytes
1b940 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1b950 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
1b960 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  c==0 );.    asse
1b970 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  rt( pPager->orig
1b980 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20 20 20  DbSize==0 );.   
1b990 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1b9a0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
1b9b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
1b9c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
1b9d0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1b9e0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
1b9f0 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
1ba00 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
1ba10 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
1ba20 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1ba30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1ba40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1ba50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61  }else{.      pPa
1ba60 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1ba70 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1ba80 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  ;.      rc = wri
1ba90 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
1baa0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
1bab0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1bac0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
1bad0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
1bae0 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51  lOff>0 || rc!=SQ
1baf0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74  LITE_OK );.  ret
1bb00 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bb10 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72   Make a page dir
1bb20 74 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72  ty.  Set its dir
1bb30 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20  ty flag and add 
1bb40 69 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a  it to the dirty.
1bb50 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f  ** page list..*/
1bb60 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b  .static void mak
1bb70 65 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50  eDirty(PgHdr *pP
1bb80 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64  g){.  if( pPg->d
1bb90 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50  irty==0 ){.    P
1bba0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1bbb0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
1bbc0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1bbd0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
1bbe0 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79  = pPager->pDirty
1bbf0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
1bc00 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20  ->pDirty ){.    
1bc10 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1bc20 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
1bc30 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  Pg;.    }.    pP
1bc40 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  g->pPrevDirty = 
1bc50 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1bc60 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d  Dirty = pPg;.  }
1bc70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
1bc80 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c   page clean.  Cl
1bc90 65 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69  ear its dirty bi
1bca0 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20  t and remove it 
1bcb0 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74  from the.** dirt
1bcc0 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  y page list..*/.
1bcd0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
1bce0 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67  Clean(PgHdr *pPg
1bcf0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
1bd00 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  rty ){.    pPg->
1bd10 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69  dirty = 0;.    i
1bd20 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29  f( pPg->pDirty )
1bd30 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  {.      pPg->pDi
1bd40 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
1bd50 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
1bd60 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
1bd70 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1bd80 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1bd90 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74  PrevDirty->pDirt
1bda0 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b  y = pPg->pDirty;
1bdb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1bdc0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
1bdd0 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69  Dirty = pPg->pDi
1bde0 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  rty;.    }.  }.}
1bdf0 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  .../*.** Mark a 
1be00 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
1be10 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
1be20 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
1be30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
1be40 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
1be50 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
1be60 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
1be70 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
1be80 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
1be90 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
1bea0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
1beb0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
1bec0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1bed0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
1bee0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
1bef0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
1bf00 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1bf10 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
1bf20 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
1bf30 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
1bf40 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
1bf50 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1bf60 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
1bf70 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
1bf80 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
1bf90 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
1bfa0 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
1bfb0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
1bfc0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
1bfd0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
1bfe0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
1bff0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
1c000 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1c010 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
1c020 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
1c030 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
1c040 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
1c050 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
1c060 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
1c070 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
1c080 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
1c090 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
1c0a0 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
1c0b0 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
1c0c0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
1c0d0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
1c0e0 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
1c0f0 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74  ommit() or sqlit
1c100 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1c110 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a  ) to.** reset..*
1c120 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
1c130 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a  er_write(PgHdr *
1c140 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44  pPg){.  void *pD
1c150 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
1c160 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65  ATA(pPg);.  Page
1c170 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1c180 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
1c190 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1c1a0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
1c1b0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
1c1c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c1d0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
1c1e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
1c1f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
1c200 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
1c210 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1c220 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
1c230 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
1c240 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
1c250 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
1c260 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61  .  /* If this pa
1c270 67 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ge was previousl
1c280 79 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20  y acquired with 
1c290 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68  noContent==1, th
1c2a0 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65  at means.  ** we
1c2b0 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72   didn't really r
1c2c0 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65  ead in the conte
1c2d0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1c2e0 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
1c2f0 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70  .  ** (for examp
1c300 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67  le) when the pag
1c310 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64  e is being moved
1c320 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
1c330 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20  .  But.  ** now 
1c340 77 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29  we are (perhaps)
1c350 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65   moving the page
1c360 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65   off of the free
1c370 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65  list for.  ** re
1c380 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20  use and we need 
1c390 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67  to know its orig
1c3a0 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20  inal content so 
1c3b0 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a  that content.  *
1c3c0 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  * can be stored 
1c3d0 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
1c3e0 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20  journal.  So do 
1c3f0 74 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73  the read at this
1c400 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f  .  ** time..  */
1c410 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65  .  rc = pager_ge
1c420 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a  t_content(pPg);.
1c430 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1c440 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1c450 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
1c460 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
1c470 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
1c480 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1c490 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
1c4a0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
1c4b0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
1c4c0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b  away..  */.  mak
1c4d0 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69  eDirty(pPg);.  i
1c4e0 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
1c4f0 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74  l && (pageInStat
1c500 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50  ement(pPg) || pP
1c510 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d  ager->stmtInUse=
1c520 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65  =0) ){.    pPage
1c530 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
1c540 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20  1;.  }else{..   
1c550 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68   /* If we get th
1c560 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73  is far, it means
1c570 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
1c580 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
1c590 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  * written to the
1c5a0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1c5b0 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63  rnal or the ckec
1c5c0 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20  kpoint journal. 
1c5d0 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20     ** or both.. 
1c5e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72     **.    ** Fir
1c5f0 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  st check to see 
1c600 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
1c610 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69  tion journal exi
1c620 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63  sts and.    ** c
1c630 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64  reate it if it d
1c640 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a  oes not..    */.
1c650 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c660 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1c670 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72  _UNLOCK );.    r
1c680 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c690 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20  Begin(pPg, 0);. 
1c6a0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1c6b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1c6c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1c6d0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c6e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1c6f0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
1c700 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
1c710 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67  rnalOpen && pPag
1c720 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
1c730 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
1c740 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
1c750 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1c760 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1c770 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1c780 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1c790 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1c7a0 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
1c7b0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
1c7c0 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1c7d0 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20  ache = 1;.  .   
1c7e0 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1c7f0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20  ion journal now 
1c800 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61  exists and we ha
1c810 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  ve a RESERVED or
1c820 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55   an.    ** EXCLU
1c830 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1c840 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
1c850 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
1c860 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a  current page to.
1c870 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73      ** the trans
1c880 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69  action journal i
1c890 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
1c8a0 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a  e already..    *
1c8b0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e  /.    if( !pPg->
1c8c0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
1c8d0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1c8e0 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20   || MEMDB) ){.  
1c8f0 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67      if( (int)pPg
1c900 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1c910 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1c920 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67          int szPg
1c930 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45  ;.        if( ME
1c940 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
1c950 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1c960 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1c970 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1c980 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54            PAGERT
1c990 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
1c9a0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1c9b0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c9c0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1c9d0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
1c9e0 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
1c9f0 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
1ca00 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d  >pOrig = sqliteM
1ca10 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
1ca20 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1ca30 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1ca40 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
1ca50 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
1ca60 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
1ca70 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1ca80 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1ca90 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1caa0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1cab0 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
1cac0 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20  um, saved;.     
1cad0 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61       char *pData
1cae0 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20  2, *pEnd;.      
1caf0 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64      /* We should
1cb00 20 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20   never write to 
1cb10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1cb20 20 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20   the page that. 
1cb30 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74           ** cont
1cb40 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
1cb50 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f  e locks.  The fo
1cb60 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76  llowing assert v
1cb70 65 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20  erifies.        
1cb80 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20    ** that we do 
1cb90 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  not. */.        
1cba0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
1cbb0 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47  gno!=PAGER_MJ_PG
1cbc0 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  NO(pPager) );.  
1cbd0 20 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d          pData2 =
1cbe0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
1cbf0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
1cc00 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
1cc10 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
1cc20 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a  sum(pPager, (u8*
1cc30 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20  )pData2);.      
1cc40 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61      pEnd = pData
1cc50 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65  2 + pPager->page
1cc60 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Size;.          
1cc70 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20  pData2 -= 4;.   
1cc80 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a         saved = *
1cc90 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20  (u32*)pEnd;.    
1cca0 20 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28        put32bits(
1ccb0 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  pEnd, cksum);.  
1ccc0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
1ccd0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
1cce0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  8;.          put
1ccf0 33 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70  32bits(pData2, p
1cd00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1cd10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1cd20 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
1cd30 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a  >jfd, pData2, sz
1cd40 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  Pg);.          I
1cd50 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
1cd60 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
1cd70 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
1cd80 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  o,.             
1cd90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1cda0 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29  urnalOff, szPg))
1cdb0 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1cdc0 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
1cdd0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
1cde0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  t);.          pP
1cdf0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1ce00 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20   += szPg;.      
1ce10 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28      PAGERTRACE5(
1ce20 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
1ce30 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
1ce40 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ce50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
1ce60 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1ce70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1ce80 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70  eedSync, pager_p
1ce90 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 20  agehash(pPg));. 
1cea0 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
1ceb0 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09  pEnd = saved;...
1cec0 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61    /* An error ha
1ced0 73 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e  s occured writin
1cee0 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g to the journal
1cef0 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20   file. The .    
1cf00 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
1cf10 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c  tion will be rol
1cf20 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20  led back by the 
1cf30 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20  layer above..   
1cf40 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1cf50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1cf60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cf70 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1cf80 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20            }..   
1cf90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
1cfa0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Rec++;.         
1cfb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1cfc0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1cfd0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
1cfe0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1cff0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1d000 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1d010 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
1d020 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
1d030 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
1d040 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1d050 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
1d060 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
1d070 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1d080 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1d090 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1d0a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1d0b0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
1d0c0 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
1d0d0 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
1d0e0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1d0f0 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
1d100 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45  nc;.        PAGE
1d110 52 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20  RTRACE4("APPEND 
1d120 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
1d130 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
1d140 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
1d150 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1d160 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
1d170 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
1d180 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
1d190 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
1d1a0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1d1b0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
1d1c0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
1d1d0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
1d1e0 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
1d1f0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1d200 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
1d210 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
1d220 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
1d230 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
1d240 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
1d250 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1d260 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
1d270 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
1d280 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
1d290 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
1d2a0 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
1d2b0 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
1d2c0 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
1d2d0 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
1d2e0 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
1d2f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1d300 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1d310 65 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65  e .     && !page
1d320 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
1d330 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74 29 70   .     && (int)p
1d340 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
1d350 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 20 20  ->stmtSize .    
1d360 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1d370 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1d380 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
1d390 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
1d3a0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
1d3b0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1d3c0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1d3d0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1d3e0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1d3f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1d400 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
1d410 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
1d420 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
1d430 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
1d440 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
1d450 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
1d460 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
1d470 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
1d480 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44  ist->pStmt, PGHD
1d490 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1d4a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d4b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1d4c0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1d4d0 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
1d4e0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
1d4f0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1d500 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
1d510 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
1d520 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
1d530 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d540 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1d550 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1d560 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1d570 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20  no, 7)-4;.      
1d580 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1d590 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1d5a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1d5b0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1d5c0 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
1d5d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1d5e0 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 50  ze+4);.        P
1d5f0 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
1d600 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1d610 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1d620 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1d630 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1d640 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d650 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1d660 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1d670 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1d680 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
1d690 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1d6a0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
1d6b0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
1d6c0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1d6d0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1d6e0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1d6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
1d700 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
1d710 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
1d720 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
1d730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d740 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1d750 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
1d760 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e  ager->dbSize<(in
1d770 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20  t)pPg->pgno ){. 
1d780 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1d790 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  e = pPg->pgno;. 
1d7a0 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26     if( !MEMDB &&
1d7b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1d7c0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50  =PENDING_BYTE/pP
1d7d0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
1d7e0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1d7f0 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a  dbSize++;.    }.
1d800 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d810 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
1d820 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
1d830 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61 2d 70  to mark a data-p
1d840 61 67 65 20 61 73 20 77 72 69 74 61 62 6c 65 2e  age as writable.
1d850 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70 61 67   It uses .** pag
1d860 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20 6f 70  er_write() to op
1d870 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  en a journal fil
1d880 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
1d890 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a 2a 2a  already open).**
1d8a0 20 61 6e 64 20 77 72 69 74 65 20 74 68 65 20 70   and write the p
1d8b0 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20 74 68  age *pData to th
1d8c0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
1d8d0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
1d8e0 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
1d8f0 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65 72 5f  ction and pager_
1d900 77 72 69 74 65 28 29 20 69 73 20 74 68 61 74 20  write() is that 
1d910 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
1d920 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69 74 68   also deals with
1d930 20 74 68 65 20 73 70 65 63 69 61 6c 20 63 61 73   the special cas
1d940 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d 6f 72  e where 2 or mor
1d950 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74 20 6f  e pages.** fit o
1d960 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73 6b 20  n a single disk 
1d970 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69 73 20  sector. In this 
1d980 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65 73 69  case all co-resi
1d990 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20 6d 75  dent pages.** mu
1d9a0 73 74 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  st have been wri
1d9b0 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
1d9c0 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72 65 20  nal file before 
1d9d0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e  returning..*/.in
1d9e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
1d9f0 69 74 65 28 44 62 50 61 67 65 20 2a 70 44 62 50  ite(DbPage *pDbP
1da00 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  age){.  int rc =
1da10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50   SQLITE_OK;..  P
1da20 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62 50  gHdr *pPg = pDbP
1da30 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  age;.  Pager *pP
1da40 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
1da50 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67 65  er;.  Pgno nPage
1da60 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70 50 61  PerSector = (pPa
1da70 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 2f  ger->sectorSize/
1da80 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1da90 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d 44 42  );..  if( !MEMDB
1daa0 20 26 26 20 6e 50 61 67 65 50 65 72 53 65 63 74   && nPagePerSect
1dab0 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f  or>1 ){.    Pgno
1dac0 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20 20   nPageCount;    
1dad0 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e        /* Total n
1dae0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
1daf0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1db00 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31 3b  */.    Pgno pg1;
1db10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20 6f   /* First page o
1db30 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67  f the sector pPg
1db40 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20   is located on. 
1db50 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65  */.    int nPage
1db60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1db70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
1db80 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ges starting at 
1db90 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  pg1 to journal *
1dba0 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20  /.    int ii;.. 
1dbb0 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f     /* Set the do
1dbc0 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20  NotSync flag to 
1dbd0 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  1. This is becau
1dbe0 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c  se we cannot all
1dbf0 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  ow a journal.   
1dc00 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65   ** header to be
1dc10 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e   written between
1dc20 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e   the pages journ
1dc30 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  aled by this fun
1dc40 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ction..    */.  
1dc50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1dc60 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29  ->doNotSync==0 )
1dc70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
1dc80 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20  NotSync = 1;..  
1dc90 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20    /* This trick 
1dca0 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74  assumes that bot
1dcb0 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  h the page-size 
1dcc0 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  and sector-size 
1dcd0 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e  are.    ** an in
1dce0 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32  teger power of 2
1dcf0 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62  . It sets variab
1dd00 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64  le pg1 to the id
1dd10 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20  entifier.    ** 
1dd20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67  of the first pag
1dd30 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  e of the sector 
1dd40 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f  pPg is located o
1dd50 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  n..    */.    pg
1dd60 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d  1 = ((pPg->pgno-
1dd70 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53  1) & ~(nPagePerS
1dd80 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a  ector-1)) + 1;..
1dd90 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d      nPageCount =
1dda0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
1ddb0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
1ddc0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
1ddd0 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
1dde0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
1ddf0 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
1de00 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
1de10 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
1de20 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
1de30 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
1de40 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
1de50 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
1de60 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1de70 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
1de80 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1de90 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
1dea0 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
1deb0 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
1dec0 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
1ded0 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
1dee0 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
1def0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
1df00 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
1df10 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
1df20 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
1df30 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
1df40 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f  || pg==pPg->pgno
1df50 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 70   || .          p
1df60 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  g>pPager->origDb
1df70 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67 65 72  Size || !(pPager
1df80 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 2f  ->aInJournal[pg/
1df90 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29 29 0a  8]&(1<<(pg&7))).
1dfa0 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20 20 20        ) {.      
1dfb0 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52 5f    if( pg!=PAGER_
1dfc0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1dfd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 48  ){.          PgH
1dfe0 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20  dr *pPage;.     
1dff0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e000 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72  3PagerGet(pPager
1e010 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20  , pg, &pPage);. 
1e020 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1e030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e040 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
1e050 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1e060 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1e070 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1e080 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1e090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1e0a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1e0b0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1e0c0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29  ->doNotSync==1 )
1e0d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f  ;.    pPager->do
1e0e0 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d  NotSync = 0;.  }
1e0f0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
1e100 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61  ager_write(pDbPa
1e110 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ge);.  }.  retur
1e120 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1e130 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
1e140 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
1e150 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
1e160 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
1e170 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
1e180 50 61 67 65 72 57 72 69 74 65 28 29 2e 20 20 49  PagerWrite().  I
1e190 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72  n other words, r
1e1a0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74  eturn TRUE if it
1e1b0 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61   is ok.** to cha
1e1c0 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  nge the content 
1e1d0 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  of the page..*/.
1e1e0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 69  #ifndef NDEBUG.i
1e1f0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  nt sqlite3PagerI
1e200 73 77 72 69 74 65 61 62 6c 65 28 44 62 50 61 67  swriteable(DbPag
1e210 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72  e *pPg){.  retur
1e220 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a  n pPg->dirty;.}.
1e230 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
1e240 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
1e250 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65  UM./*.** Replace
1e260 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1e270 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69  a single page wi
1e280 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  th the informati
1e290 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a  on in the third.
1e2a0 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
1e2b0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e2c0 4f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  Overwrite(Pager 
1e2d0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
1e2e0 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
1e2f0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1e300 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20    int rc;..  rc 
1e310 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
1e320 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  t(pPager, pgno, 
1e330 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63 3d  &pPg);.  if( rc=
1e340 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e350 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1e360 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
1e370 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e380 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
1e390 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61 67 65  mcpy(sqlite3Page
1e3a0 72 47 65 74 44 61 74 61 28 70 50 67 29 2c 20 70  rGetData(pPg), p
1e3b0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
1e3c0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
1e3d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1e3e0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  nref(pPg);.  }. 
1e3f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
1e400 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
1e410 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
1e420 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
1e430 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
1e440 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
1e450 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
1e460 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
1e470 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
1e480 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
1e490 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
1e4a0 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
1e4b0 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
1e4c0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
1e4d0 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
1e4e0 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
1e4f0 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
1e500 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
1e510 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
1e520 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
1e530 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
1e540 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
1e550 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
1e560 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
1e570 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
1e580 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
1e590 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
1e5a0 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
1e5b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1e5c0 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  tRollback() belo
1e5d0 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
1e5e0 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
1e5f0 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
1e600 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
1e610 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
1e620 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
1e630 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
1e640 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1e650 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
1e660 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1e670 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
1e680 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
1e690 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
1e6a0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1e6b0 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
1e6c0 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
1e6d0 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
1e6e0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
1e6f0 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
1e700 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
1e710 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
1e720 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
1e730 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
1e740 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
1e750 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
1e760 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
1e770 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
1e780 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
1e790 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
1e7a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
1e7b0 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
1e7c0 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
1e7d0 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
1e7e0 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
1e7f0 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
1e800 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1e810 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
1e820 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50  .** the sqlite3P
1e830 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1e840 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
1e850 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
1e860 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  se the.** page c
1e870 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
1e880 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
1e890 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
1e8a0 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65  it gets.** rolle
1e8b0 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
1e8c0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
1e8d0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1e8e0 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
1e8f0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
1e900 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1e910 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  bPage){.  PgHdr 
1e920 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1e930 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1e940 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
1e950 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65    if( MEMDB ) re
1e960 74 75 72 6e 3b 0a 20 20 70 50 67 2d 3e 61 6c 77  turn;.  pPg->alw
1e970 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
1e980 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1e990 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74  y && !pPager->st
1e9a0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
1e9b0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1e9c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52  tate>=PAGER_SHAR
1e9d0 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ED );.    if( pP
1e9e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
1e9f0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
1ea00 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1ea10 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
1ea20 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
1ea30 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
1ea40 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
1ea50 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
1ea60 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
1ea70 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
1ea80 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
1ea90 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
1eaa0 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
1eab0 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
1eac0 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
1ead0 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
1eae0 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
1eaf0 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
1eb00 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
1eb10 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
1eb20 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
1eb30 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
1eb40 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
1eb50 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
1eb60 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
1eb70 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
1eb80 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
1eb90 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
1eba0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
1ebb0 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
1ebc0 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
1ebd0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1ebe0 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
1ebf0 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
1ec00 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
1ec10 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
1ec20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ec30 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e  PAGERTRACE3("DON
1ec40 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
1ec50 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
1ec60 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
1ec70 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54  ger));.      IOT
1ec80 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20  RACE(("CLEAN %p 
1ec90 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1eca0 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20  Pg->pgno)).     
1ecb0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
1ecc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1ecd0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20  HECK_PAGES.     
1ece0 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1ecf0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1ed00 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
1ed10 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1ed20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
1ed30 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
1ed40 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
1ed50 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
1ed60 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
1ed70 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
1ed80 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
1ed90 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
1eda0 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
1edb0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
1edc0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
1edd0 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
1ede0 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
1edf0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1ee00 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68 61 76  .**.** If we hav
1ee10 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75 61 6c  e not yet actual
1ee20 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74  ly read the cont
1ee30 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61 67 65  ent of this page
1ee40 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67 48 64   (if.** the PgHd
1ee50 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61 67 20  r.needRead flag 
1ee60 69 73 20 73 65 74 29 20 74 68 65 6e 20 74 68 69  is set) then thi
1ee70 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73 20 61  s routine acts a
1ee80 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74  s a promise.** t
1ee90 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65 76 65  hat we will neve
1eea0 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64 20 74  r need to read t
1eeb0 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1eec0 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a  in the future..*
1eed0 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52 65 61  * so the needRea
1eee0 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20 63 6c  d flag can be cl
1eef0 65 61 72 65 64 20 61 74 20 74 68 69 73 20 70 6f  eared at this po
1ef00 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  int..*/.void sql
1ef10 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
1ef20 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50  lback(DbPage *pP
1ef30 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
1ef40 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1ef50 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  r;..  assert( pP
1ef60 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
1ef70 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
1ef80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
1ef90 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65  rnalOpen==0 ) re
1efa0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
1efb0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1efc0 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  || pPager->alway
1efd0 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d  sRollback || MEM
1efe0 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1eff0 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  f( !pPg->inJourn
1f000 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
1f010 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
1f020 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
1f030 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f040 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20  ->aInJournal!=0 
1f050 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1f060 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70  InJournal[pPg->p
1f070 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1f080 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1f090 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
1f0a0 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65   1;.    pPg->nee
1f0b0 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 69  dRead = 0;.    i
1f0c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1f0d0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
1f0e0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
1f0f0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1f100 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1f110 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54      }.    PAGERT
1f120 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
1f130 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
1f140 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1f150 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1f160 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
1f170 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c  ("GARBAGE %p %d\
1f180 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1f190 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66  >pgno)).  }.  if
1f1a0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1f1b0 55 73 65 20 0a 20 20 20 26 26 20 21 70 61 67 65  Use .   && !page
1f1c0 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29  InStatement(pPg)
1f1d0 20 0a 20 20 20 26 26 20 28 69 6e 74 29 70 50 67   .   && (int)pPg
1f1e0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1f1f0 73 74 6d 74 53 69 7a 65 20 0a 20 20 29 7b 0a 20  stmtSize .  ){. 
1f200 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1f210 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
1f220 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
1f230 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1f240 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1f250 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
1f260 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1f270 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
1f280 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
1f290 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 7d 0a  >pgno&7);.  }.}.
1f2a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
1f2b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
1f2c0 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
1f2d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
1f2e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
1f2f0 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
1f300 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
1f310 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
1f320 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
1f330 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
1f340 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
1f350 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
1f360 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
1f370 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
1f380 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68   if( !pPager->ch
1f390 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b  angeCountDone ){
1f3a0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67  .    /* Open pag
1f3b0 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20  e 1 of the file 
1f3c0 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a  for writing. */.
1f3d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f3e0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
1f3f0 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20   1, &pPgHdr);.  
1f400 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f410 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1f420 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1f430 33 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48  3PagerWrite(pPgH
1f440 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
1f450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
1f460 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 20 20 2f  urn rc;.  .    /
1f470 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65  * Read the curre
1f480 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65  nt value at byte
1f490 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e   24. */.    chan
1f4a0 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74  ge_counter = ret
1f4b0 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48  rieve32bits(pPgH
1f4c0 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20 20 20 20  dr, 24);.  .    
1f4d0 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1f4e0 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1f4f0 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1f500 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1f510 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
1f520 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33  nter++;.    put3
1f530 32 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47  2bits(((char*)PG
1f540 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48  HDR_TO_DATA(pPgH
1f550 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f  dr))+24, change_
1f560 63 6f 75 6e 74 65 72 29 3b 0a 20 20 0a 20 20 20  counter);.  .   
1f570 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1f580 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1f590 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
1f5a0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
1f5b0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
1f5c0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1f5d0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1f5e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f5f0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1f600 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1f610 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1f620 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1f630 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1f640 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1f650 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1f660 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1f670 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1f680 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1f690 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1f6a0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1f6b0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1f6c0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1f6d0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1f6e0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1f6f0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1f700 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1f710 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1f720 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1f730 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1f740 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1f750 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1f760 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1f770 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1f780 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1f790 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1f7a0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1f7b0 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1f7c0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1f7d0 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1f7e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1f7f0 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1f800 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1f810 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1f820 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1f830 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1f840 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1f850 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
1f860 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
1f870 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  ne() call..**.**
1f880 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1f890 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1f8a0 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1f8b0 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1f8c0 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1f8d0 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1f8e0 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1f8f0 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1f900 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1f910 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  erCommitPhaseOne
1f920 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
1f940 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63  ter, Pgno nTrunc
1f950 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
1f960 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45  LITE_OK;..  PAGE
1f970 52 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53  RTRACE4("DATABAS
1f980 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
1f990 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
1f9a0 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
1f9b0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1f9c0 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
1f9d0 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
1f9e0 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1f9f0 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
1fa00 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
1fa10 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
1fa20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
1fa30 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1fa40 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
1fa50 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1fa60 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1fa70 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
1fa80 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1fa90 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
1faa0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
1fab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1fac0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1fad0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
1fae0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1faf0 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
1fb00 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1fb10 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
1fb20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1fb30 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
1fb40 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
1fb50 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
1fb60 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
1fb70 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1fb80 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
1fb90 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1fba0 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1fbb0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1fbc0 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1fbd0 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1fbe0 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1fbf0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1fc00 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1fc10 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1fc20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1fc30 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1fc40 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1fc50 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1fc60 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1fc70 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
1fc80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1fc90 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1fca0 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
1fcb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1fcc0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
1fcd0 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1fce0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1fcf0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1fd00 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1fd10 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1fd20 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1fd30 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1fd40 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1fd50 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1fd60 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1fd70 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1fd80 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
1fd90 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1fda0 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  o i;.        int
1fdb0 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d   iSkip = PAGER_M
1fdc0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a  J_PGNO(pPager);.
1fdd0 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
1fde0 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
1fdf0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
1fe00 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
1fe10 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61   if( !(pPager->a
1fe20 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26  InJournal[i/8] &
1fe30 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20   (1<<(i&7))) && 
1fe40 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20  i!=iSkip ){.    
1fe50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1fe60 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1fe70 67 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20  ger, i, &pPg);. 
1fe80 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1fe90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1fea0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1feb0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1fec0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1fed0 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  e(pPg);.        
1fee0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1fef0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1ff00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ff10 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1ff20 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1ff30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ff40 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1ff50 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1ff60 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1ff70 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1ff80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ff90 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1ffa0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1ffb0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1ffc0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1ffd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ffe0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fff0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
20000 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20010 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20020 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
20030 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
20040 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
20050 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29  (pPager, nTrunc)
20060 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
20070 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
20080 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
20090 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
200a0 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79   Write all dirty
200b0 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61   pages to the da
200c0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
200d0 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
200e0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
200f0 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
20100 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
20110 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a  _pagelist(pPg);.
20120 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20130 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
20140 63 5f 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67  c_exit;.    pPag
20150 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
20160 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
20170 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
20180 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
20190 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
201a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
201b0 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66  OsSync(pPager->f
201c0 64 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  d, 0);.    }.   
201d0 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e   IOTRACE(("DBSYN
201e0 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
201f0 29 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  )..    pPager->s
20200 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
20210 43 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CED;.  }else if(
20220 20 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63   MEMDB && nTrunc
20230 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
20240 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
20250 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
20260 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f  unc);.  }..sync_
20270 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d  exit:.  if( rc==
20280 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
20290 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70  CKED ){.    /* p
202a0 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
202b0 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74  counter() may at
202c0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
202d0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20  an exclusive.   
202e0 20 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c    * lock to spil
202f0 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  l the cache and 
20300 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f  return IOERR_BLO
20310 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20  CKED. But since 
20320 0a 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73  .     * there is
20330 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63   no chance the c
20340 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73  ache is inconsis
20350 74 65 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20  tent, it's.     
20360 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75  * better to retu
20370 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
20380 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d       */.    rc =
20390 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
203a0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
203b0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  .../*.** Commit 
203c0 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
203d0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
203e0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
203f0 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
20400 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
20410 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
20420 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
20430 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
20440 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
20450 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
20460 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
20470 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
20480 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
20490 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
204a0 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  gerCommitPhaseTw
204b0 6f 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  o(Pager *pPager)
204c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
204d0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
204e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
204f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
20500 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
20510 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
20520 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
20530 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
20540 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
20550 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  R;.  }.  PAGERTR
20560 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
20570 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
20580 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
20590 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
205a0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
205b0 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
205c0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
205d0 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
205e0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
205f0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
20600 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63  pPager);.      c
20610 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73  learHistory(pHis
20620 74 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  t);.      pPg->d
20630 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
20640 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
20650 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d   0;.      pHist-
20660 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
20670 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
20680 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
20690 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
206a0 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
206b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
206c0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
206d0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
206e0 70 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e  pDirty = 0;.#ifn
206f0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66  def NDEBUG.    f
20700 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
20710 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
20720 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
20730 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
20740 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
20750 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
20760 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
20770 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c   !pPg->alwaysRol
20780 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61  lback );.      a
20790 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70  ssert( !pHist->p
207a0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73  Orig );.      as
207b0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53  sert( !pHist->pS
207c0 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  tmt );.    }.#en
207d0 64 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  dif.    pPager->
207e0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
207f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
20800 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
20810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20820 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
20830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20840 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
20850 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
20860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20870 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
20880 4e 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d  NCED || !pPager-
20890 3e 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20  >dirtyCache );. 
208a0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f   rc = pager_end_
208b0 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
208c0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61  er);.  return pa
208d0 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72  ger_error(pPager
208e0 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , rc);.}../*.** 
208f0 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
20900 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
20910 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
20920 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
20930 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
20940 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
20950 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
20960 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
20970 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
20980 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
20990 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
209a0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
209b0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
209c0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
209d0 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
209e0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
209f0 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f  cking protocol o
20a00 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
20a10 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
20a20 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
20a30 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
20a40 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
20a50 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
20a60 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
20a70 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
20a80 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
20a90 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
20aa0 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
20ab0 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
20ac0 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
20ad0 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
20ae0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20af0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
20b00 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
20b10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
20b20 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45    int rc;.  PAGE
20b30 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
20b40 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
20b50 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
20b60 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
20b70 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
20b80 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
20b90 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
20ba0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
20bb0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
20bc0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
20bd0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
20be0 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
20bf0 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
20c00 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
20c10 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
20c20 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
20c30 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
20c40 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
20c50 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
20c60 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
20c70 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
20c80 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
20c90 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
20ca0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
20cb0 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
20cc0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
20cd0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
20ce0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
20cf0 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
20d00 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
20d10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
20d20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
20d30 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
20d40 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
20d50 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
20d60 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
20d70 65 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  e{.        PAGER
20d80 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20  TRACE3("PAGE %d 
20d90 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e  is clean on %d\n
20da0 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45  ", p->pgno, PAGE
20db0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
20dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61      }.      clea
20dd0 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b  rHistory(pHist);
20de0 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20  .      p->dirty 
20df0 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
20e00 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
20e10 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74     pHist->inStmt
20e20 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73   = 0;.      pHis
20e30 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
20e40 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
20e50 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
20e60 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
20e70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
20e80 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c  er->xReiniter(p,
20e90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
20ea0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
20eb0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
20ec0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
20ed0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
20ee0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
20ef0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ize = pPager->or
20f00 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61  igDbSize;.    pa
20f10 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
20f20 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
20f30 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
20f40 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
20f50 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
20f60 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
20f70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
20f80 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
20f90 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c  r->dirtyCache ||
20fa0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
20fb0 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20  lOpen ){.    rc 
20fc0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
20fd0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
20fe0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
20ff0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
21000 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
21010 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
21020 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
21030 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21040 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
21050 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
21060 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
21070 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
21080 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
21090 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20  ->errCode;.  }. 
210a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
210b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
210c0 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
210d0 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  2;.    rc = page
210e0 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
210f0 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d  r, 0);.    rc2 =
21100 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
21110 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
21120 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
21130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21140 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
21150 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
21160 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
21170 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a  pPager, 0);.  }.
21180 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74    /* pager_reset
21190 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70  (pPager); */.  p
211a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
211b0 2d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20  -1;..  /* If an 
211c0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
211d0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20  ing a ROLLBACK, 
211e0 77 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72  we can no longer
211f0 20 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72   trust the pager
21200 0a 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20  .  ** cache. So 
21210 63 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72  call pager_error
21220 28 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75  () on the way ou
21230 74 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72  t to make any er
21240 72 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73  ror .  ** persis
21250 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74  tent..  */.  ret
21260 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
21270 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
21280 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
21290 45 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  E if the databas
212a0 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  e file is opened
212b0 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74   read-only.  Ret
212c0 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
212d0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
212e0 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74  (in theory) writ
212f0 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  able..*/.int sql
21300 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
21310 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
21320 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
21330 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
21340 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
21350 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
21360 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
21370 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ager..*/.int sql
21380 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
21390 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
213a0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
213b0 72 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64  r->nRef;.}..#ifd
213c0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
213d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
213e0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
213f0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
21400 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
21410 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
21420 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
21430 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
21440 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
21450 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
21460 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
21470 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
21480 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
21490 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
214a0 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
214b0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
214c0 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
214d0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d  >errCode;.  a[6]
214e0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
214f0 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
21500 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
21510 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f  = 0;  /* Used to
21520 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66   be pPager->nOvf
21530 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50  l */.  a[9] = pP
21540 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
21550 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
21560 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
21570 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  a;.}.#endif../*.
21580 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
21590 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
215a0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
215b0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
215c0 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
215d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
215e0 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
215f0 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
21600 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
21610 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
21620 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
21630 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
21640 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
21650 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
21660 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
21670 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
21680 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42  qlite3PagerStmtB
21690 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
216a0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
216b0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
216c0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
216d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
216e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
216f0 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ARED );.  assert
21700 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
21710 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52  >=0 );.  PAGERTR
21720 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
21730 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
21740 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
21750 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
21760 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
21770 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
21780 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
21790 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
217a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
217b0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
217c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
217d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
217e0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
217f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
21800 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
21810 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
21820 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
21830 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
21840 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
21850 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
21860 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
21870 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
21880 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  {.    /* sqlite3
21890 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
218a0 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
218b0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
218c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
218d0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
218e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
218f0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
21900 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
21910 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
21920 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
21930 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
21940 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21950 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
21960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
21970 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
21980 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
21990 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
219a0 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
219b0 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
219c0 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
219d0 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
219e0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
219f0 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
21a00 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
21a10 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
21a20 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
21a30 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
21a40 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74  temp(&pPager->st
21a50 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
21a60 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
21a70 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
21a80 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
21a90 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
21aa0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
21ab0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
21ac0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
21ad0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
21ae0 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
21af0 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
21b00 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
21b10 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
21b20 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
21b30 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
21b40 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
21b50 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
21b60 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
21b70 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
21b80 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
21b90 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
21ba0 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
21bb0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
21bc0 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
21bd0 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54  Next;.    PAGERT
21be0 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d  RACE2("STMT-COMM
21bf0 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  IT %d\n", PAGERI
21c00 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
21c10 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
21c20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
21c30 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
21c40 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c  0);.      /* sql
21c50 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
21c60 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
21c70 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
21c80 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
21c90 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
21ca0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
21cb0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
21cc0 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61       for(pPg=pPa
21cd0 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
21ce0 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
21cf0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
21d00 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
21d10 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
21d20 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78  r);.        pNex
21d30 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
21d40 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73  Stmt;.        as
21d50 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53  sert( pHist->inS
21d60 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70  tmt );.        p
21d70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
21d80 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
21d90 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69  >pPrevStmt = pHi
21da0 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
21db0 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
21dc0 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  eFree(pHist->pSt
21dd0 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
21de0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
21df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
21e00 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
21e10 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
21e20 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
21e30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
21e40 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
21e50 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
21e60 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
21e70 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21e80 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
21e90 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69   statement..*/.i
21ea0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
21eb0 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  tmtRollback(Page
21ec0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
21ed0 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
21ee0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
21ef0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
21f00 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
21f10 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
21f20 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
21f30 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
21f40 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
21f50 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
21f60 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  st;.      for(pP
21f70 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
21f80 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d   pPg; pPg=pHist-
21f90 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
21fa0 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
21fb0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
21fc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
21fd0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
21fe0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
21ff0 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
22000 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
22010 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
22020 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
22030 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
22040 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
22050 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
22060 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  pStmt = 0;.     
22070 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22080 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
22090 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
220a0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65  Size;.      page
220b0 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65  r_truncate_cache
220c0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
220d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
220e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
220f0 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74   rc = pager_stmt
22100 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
22110 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
22120 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
22130 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  mit(pPager);.  }
22140 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
22150 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
22160 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
22170 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
22180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22190 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
221a0 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
221b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
221c0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
221d0 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
221e0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
221f0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
22200 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
22210 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
22220 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
22230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
22240 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
22250 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69   *sqlite3PagerDi
22260 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
22270 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
22280 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
22290 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
222a0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
222b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
222c0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
222d0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
222e0 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
222f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22300 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
22310 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
22320 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
22330 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
22340 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
22350 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
22360 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
22370 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
22380 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
22390 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
223a0 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
223b0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
223c0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
223d0 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
223e0 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
223f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
22400 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
22410 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
22420 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
22430 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
22440 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
22450 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
22460 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
22470 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
22480 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
22490 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
224a0 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
224b0 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23  = pCodecArg;.}.#
224c0 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
224d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
224e0 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
224f0 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69   the page identi
22500 66 69 65 64 20 62 79 20 70 44 61 74 61 20 74 6f  fied by pData to
22510 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
22520 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  n the file. .**.
22530 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
22540 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
22550 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  o the current pa
22560 67 65 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72  ge pgno. If curr
22570 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f  ent page.** pgno
22580 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
22590 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
225a0 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e  journal, it is n
225b0 6f 74 20 77 72 69 74 74 65 6e 20 74 68 65 72 65  ot written there
225c0 20 62 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72   by.** by this r
225d0 6f 75 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65  outine. The same
225e0 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20   applies to the 
225f0 70 61 67 65 20 70 44 61 74 61 20 72 65 66 65 72  page pData refer
22600 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f  s to on entry to
22610 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
22620 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63  ..**.** Referenc
22630 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 72  es to the page r
22640 65 66 65 72 65 64 20 74 6f 20 62 79 20 70 44 61  efered to by pDa
22650 74 61 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e  ta remain valid.
22660 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a   Updating any.**
22670 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63   meta-data assoc
22680 69 61 74 65 64 20 77 69 74 68 20 70 61 67 65 20  iated with page 
22690 70 44 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61  pData (i.e. data
226a0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e   stored in the n
226b0 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61  Extra bytes.** a
226c0 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77  llocated along w
226d0 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73  ith the page) is
226e0 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
226f0 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
22700 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73  r..**.** A trans
22710 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61  action must be a
22720 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20  ctive when this 
22730 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
22740 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65  d. It used to be
22750 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61  .** required tha
22760 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  t a statement tr
22770 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f  ansaction was no
22780 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68  t active, but th
22790 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a  is restriction.*
227a0 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76  * has been remov
227b0 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58  ed (CREATE INDEX
227c0 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61   needs to move a
227d0 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61   page when a sta
227e0 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61  tement.** transa
227f0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29  ction is active)
22800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
22810 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61  PagerMovepage(Pa
22820 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50  ger *pPager, DbP
22830 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70  age *pPg, Pgno p
22840 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
22850 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b  PgOld; .  int h;
22860 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
22870 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Pgno = 0;..  ass
22880 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
22890 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43   );..  PAGERTRAC
228a0 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
228b0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
228c0 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
228d0 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
228e0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
228f0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
22900 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54  nc, pgno);.  IOT
22910 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
22920 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
22930 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
22940 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f  ))..  pager_get_
22950 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
22960 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
22970 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  c ){.    needSyn
22980 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
22990 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
229a0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b  Pg->inJournal );
229b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
229c0 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61  ->dirty );.    a
229d0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
229e0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
229f0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
22a00 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63  from it's hash-c
22a10 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
22a20 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
22a30 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
22a40 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
22a50 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
22a60 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
22a70 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
22a80 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
22a90 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
22aa0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
22ab0 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
22ac0 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
22ad0 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
22ae0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
22af0 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
22b00 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
22b10 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
22b20 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c  re..  */.  pPgOl
22b30 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  d = pager_lookup
22b40 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
22b50 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a    if( pPgOld ){.
22b60 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 4f      assert( pPgO
22b70 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  ld->nRef==0 );. 
22b80 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61     unlinkHashCha
22b90 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c  in(pPager, pPgOl
22ba0 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61  d);.    makeClea
22bb0 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69  n(pPgOld);.    i
22bc0 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53  f( pPgOld->needS
22bd0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ync ){.      ass
22be0 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a  ert( pPgOld->inJ
22bf0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20  ournal );.      
22c00 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
22c10 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   1;.      pPg->n
22c20 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
22c30 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
22c40 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
22c50 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43     }.  }..  /* C
22c60 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e  hange the page n
22c70 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e  umber for pPg an
22c80 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f  d insert it into
22c90 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68   the new hash-ch
22ca0 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  ain. */.  assert
22cb0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70  ( pgno!=0 );.  p
22cc0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
22cd0 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70  .  h = pgno & (p
22ce0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b  Pager->nHash-1);
22cf0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
22d00 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
22d10 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
22d20 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
22d30 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
22d40 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
22d50 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
22d60 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
22d70 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
22d80 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
22d90 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
22da0 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
22db0 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65  ash = 0;..  make
22dc0 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50  Dirty(pPg);.  pP
22dd0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
22de0 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
22df0 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
22e00 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
22e10 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
22e20 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
22e30 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
22e40 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
22e50 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
22e60 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
22e70 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
22e80 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
22e90 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
22ea0 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
22eb0 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
22ec0 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
22ed0 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
22ee0 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
22ef0 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
22f00 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
22f10 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
22f20 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
22f30 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
22f40 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
22f50 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
22f60 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
22f70 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
22f80 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
22f90 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
22fa0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
22fb0 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
22fc0 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
22fd0 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
22fe0 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
22ff0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
23000 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
23010 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
23020 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
23030 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
23040 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
23050 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
23060 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
23070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
23080 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
23090 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
230a0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  ync = 1;.    pPg
230b0 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  Hdr->needSync = 
230c0 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 69  1;.    pPgHdr->i
230d0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
230e0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 48    makeDirty(pPgH
230f0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
23100 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
23110 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
23120 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
23130 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
23140 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
23150 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
23160 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
23170 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
23180 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
23190 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
231a0 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44  eturn PGHDR_TO_D
231b0 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a  ATA(pPg);.}../*.
231c0 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
231d0 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
231e0 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
231f0 20 22 65 78 74 72 61 22 20 73 70 61 63 65 20 0a   "extra" space .
23200 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
23210 6e 67 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ng with the spec
23220 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
23230 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
23240 72 47 65 74 45 78 74 72 61 28 44 62 50 61 67 65  rGetExtra(DbPage
23250 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
23260 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
23270 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e 20  Pager;.  return 
23280 28 70 50 61 67 65 72 3f 50 47 48 44 52 5f 54 4f  (pPager?PGHDR_TO
23290 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
232a0 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  er):0);.}../*.**
232b0 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c 6f 63   Get/set the loc
232c0 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68  king-mode for th
232d0 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
232e0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
232f0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
23300 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
23310 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ERY, PAGER_LOCKI
23320 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
23330 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49   .** PAGER_LOCKI
23340 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
23350 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74  . If the paramet
23360 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59  er is not _QUERY
23370 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f  , then.** the lo
23380 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65  cking-mode is se
23390 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73  t to the value s
233a0 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20  pecified..**.** 
233b0 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
233c0 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41 47  ue is either PAG
233d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
233e0 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45  ORMAL or.** PAGE
233f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
23400 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63 61 74  CLUSIVE, indicat
23410 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
23420 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65  (possibly update
23430 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  d).** locking-mo
23440 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  de..*/.int sqlit
23450 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f  e3PagerLockingMo
23460 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  de(Pager *pPager
23470 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20  , int eMode){.  
23480 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50  assert( eMode==P
23490 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
234a0 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20  _QUERY.         
234b0 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
234c0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
234d0 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20 20 20  ORMAL.          
234e0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
234f0 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
23500 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73  CLUSIVE );.  ass
23510 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
23520 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20 29  NGMODE_QUERY<0 )
23530 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
23540 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
23550 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47 45 52  RMAL>=0 && PAGER
23560 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43  _LOCKINGMODE_EXC
23570 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69  LUSIVE>=0 );.  i
23580 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21  f( eMode>=0 && !
23590 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
235a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
235b0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20  exclusiveMode = 
235c0 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
235d0 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
235e0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a  >exclusiveMode;.
235f0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  }..#if defined(S
23600 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
23610 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
23620 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
23630 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
23640 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
23650 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
23660 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
23670 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
23680 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
23690 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
236a0 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
236b0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
236c0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
236d0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
236e0 61 67 65 72 4c 6f 63 6b 73 74 61 74 65 28 50 61  agerLockstate(Pa
236f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23700 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
23710 4c 6f 63 6b 53 74 61 74 65 28 70 50 61 67 65 72  LockState(pPager
23720 2d 3e 66 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ->fd);.}.#endif.
23730 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
23740 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  EBUG./*.** Print
23750 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c   a listing of al
23760 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  l referenced pag
23770 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66  es and their ref
23780 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20   count..*/.void 
23790 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64  sqlite3PagerRefd
237a0 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
237b0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
237c0 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
237d0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
237e0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
237f0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
23800 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
23810 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
23820 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
23830 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
23840 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
23850 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
23860 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
23870 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
23880 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
23890 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
238a0 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.