/ Hex Artifact Content
Login

Artifact 84072e9b5f370752176e5f7575557496bf239bc3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 33 31  : pager.c,v 1.31
0350: 33 20 32 30 30 37 2f 30 34 2f 30 31 20 32 33 3a  3 2007/04/01 23:
0360: 34 39 3a 35 32 20 64 72 68 20 45 78 70 20 24 0a  49:52 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
19b0: 74 20 50 67 48 64 72 20 50 67 48 64 72 3b 0a 73  t PgHdr PgHdr;.s
19c0: 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a 20 20  truct PgHdr {.  
19d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20 20  Pager *pPager;  
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f 20 77  * The pager to w
1a00: 68 69 63 68 20 74 68 69 73 20 70 61 67 65 20 62  hich this page b
1a10: 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f  elongs */.  Pgno
1a20: 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20   pgno;          
1a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1a40: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1a50: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1a60: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48 61 73   PgHdr *pNextHas
1a70: 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b 20 20  h, *pPrevHash;  
1a80: 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73 69 6f  /* Hash collisio
1a90: 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67 48 64  n chain for PgHd
1aa0: 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67 48 64  r.pgno */.  PgHd
1ab0: 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20 2a 70  r *pNextFree, *p
1ac0: 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20 46 72  PrevFree;  /* Fr
1ad0: 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  eelist of pages 
1ae0: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20 2a 2f  where nRef==0 */
1af0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
1b00: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
1b10: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
1b20: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
1b30: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
1b40: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
1b50: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
1b60: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
1b70: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b80: 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  nJournal;       
1b90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1ba0: 55 45 20 69 66 20 68 61 73 20 62 65 65 6e 20 77  UE if has been w
1bb0: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
1bc0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
1bd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1be0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1bf0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
1c00: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
1c10: 20 20 75 38 20 64 69 72 74 79 3b 20 20 20 20 20    u8 dirty;     
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65 20 6e   /* TRUE if we n
1c40: 65 65 64 20 74 6f 20 77 72 69 74 65 20 62 61 63  eed to write bac
1c50: 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20 20 75  k changes */.  u
1c60: 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20  8 needSync;     
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c80: 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20 62 65   Sync journal be
1c90: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 68 69  fore writing thi
1ca0: 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 61  s page */.  u8 a
1cb0: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
1cd0: 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61  sable DontRollba
1ce0: 63 6b 28 29 20 66 6f 72 20 74 68 69 73 20 70 61  ck() for this pa
1cf0: 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e  ge */.  short in
1d00: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
1d10: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1d20: 20 6f 66 20 75 73 65 72 73 20 6f 66 20 74 68 69   of users of thi
1d30: 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48 64  s page */.  PgHd
1d40: 72 20 2a 70 44 69 72 74 79 2c 20 2a 70 50 72 65  r *pDirty, *pPre
1d50: 76 44 69 72 74 79 3b 20 20 20 20 2f 2a 20 44 69  vDirty;    /* Di
1d60: 72 74 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 75  rty pages */.  u
1d70: 33 32 20 6e 6f 74 55 73 65 64 3b 20 20 20 20 20  32 notUsed;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d90: 20 42 75 66 66 65 72 20 73 70 61 63 65 20 2a 2f   Buffer space */
1da0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
1db0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 75 33 32  HECK_PAGES.  u32
1dc0: 20 70 61 67 65 48 61 73 68 3b 0a 23 65 6e 64 69   pageHash;.#endi
1dd0: 66 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  f.  /* pPager->p
1de0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66  ageSize bytes of
1df0: 20 70 61 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f   page data follo
1e00: 77 20 74 68 69 73 20 68 65 61 64 65 72 20 2a 2f  w this header */
1e10: 0a 20 20 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74  .  /* Pager.nExt
1e20: 72 61 20 62 79 74 65 73 20 6f 66 20 6c 6f 63 61  ra bytes of loca
1e30: 6c 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68  l data follow th
1e40: 65 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d  e page data */.}
1e50: 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  ;../*.** For an 
1e60: 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64  in-memory only d
1e70: 61 74 61 62 61 73 65 2c 20 73 6f 6d 65 20 65 78  atabase, some ex
1e80: 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  tra information 
1e90: 69 73 20 72 65 63 6f 72 64 65 64 20 61 62 6f 75  is recorded abou
1ea0: 74 0a 2a 2a 20 65 61 63 68 20 70 61 67 65 20 73  t.** each page s
1eb0: 6f 20 74 68 61 74 20 63 68 61 6e 67 65 73 20 63  o that changes c
1ec0: 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
1ed0: 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c  k.  (Journal fil
1ee0: 65 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73  es are not.** us
1ef0: 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  ed for in-memory
1f00: 20 64 61 74 61 62 61 73 65 73 2e 29 20 20 54 68   databases.)  Th
1f10: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f  e following info
1f20: 72 6d 61 74 69 6f 6e 20 69 73 20 61 64 64 65 64  rmation is added
1f30: 20 74 6f 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f   to.** the end o
1f40: 66 20 65 76 65 72 79 20 45 58 54 52 41 20 62 6c  f every EXTRA bl
1f50: 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  ock for in-memor
1f60: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a  y databases..**.
1f70: 2a 2a 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  ** This informat
1f80: 69 6f 6e 20 63 6f 75 6c 64 20 68 61 76 65 20 62  ion could have b
1f90: 65 65 6e 20 61 64 64 65 64 20 64 69 72 65 63 74  een added direct
1fa0: 6c 79 20 74 6f 20 74 68 65 20 50 67 48 64 72 20  ly to the PgHdr 
1fb0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75  structure..** Bu
1fc0: 74 20 74 68 65 6e 20 69 74 20 77 6f 75 6c 64 20  t then it would 
1fd0: 74 61 6b 65 20 75 70 20 61 6e 20 65 78 74 72 61  take up an extra
1fe0: 20 38 20 62 79 74 65 73 20 6f 66 20 73 74 6f 72   8 bytes of stor
1ff0: 61 67 65 20 6f 6e 20 65 76 65 72 79 20 50 67 48  age on every PgH
2000: 64 72 0a 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64  dr.** even for d
2010: 69 73 6b 2d 62 61 73 65 64 20 64 61 74 61 62 61  isk-based databa
2020: 73 65 73 2e 20 20 53 70 6c 69 74 74 69 6e 67 20  ses.  Splitting 
2030: 69 74 20 6f 75 74 20 73 61 76 65 73 20 38 20 62  it out saves 8 b
2040: 79 74 65 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69  ytes.  This.** i
2050: 73 20 6f 6e 6c 79 20 61 20 73 61 76 69 6e 67 73  s only a savings
2060: 20 6f 66 20 30 2e 38 25 20 62 75 74 20 74 68 6f   of 0.8% but tho
2070: 73 65 20 70 65 72 63 65 6e 74 61 67 65 73 20 61  se percentages a
2080: 64 64 20 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65  dd up..*/.typede
2090: 66 20 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  f struct PgHisto
20a0: 72 79 20 50 67 48 69 73 74 6f 72 79 3b 0a 73 74  ry PgHistory;.st
20b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 7b  ruct PgHistory {
20c0: 0a 20 20 75 38 20 2a 70 4f 72 69 67 3b 20 20 20  .  u8 *pOrig;   
20d0: 20 20 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61    /* Original pa
20e0: 67 65 20 74 65 78 74 2e 20 20 52 65 73 74 6f 72  ge text.  Restor
20f0: 65 20 74 6f 20 74 68 69 73 20 6f 6e 20 61 20 66  e to this on a f
2100: 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ull rollback */.
2110: 20 20 75 38 20 2a 70 53 74 6d 74 3b 20 20 20 20    u8 *pStmt;    
2120: 20 2f 2a 20 54 65 78 74 20 61 73 20 69 74 20 77   /* Text as it w
2130: 61 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  as at the beginn
2140: 69 6e 67 20 6f 66 20 74 68 65 20 63 75 72 72 65  ing of the curre
2150: 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  nt statement */.
2160: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
2170: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
2180: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
2190: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
21a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
21b0: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
21c0: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
21d0: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
21e0: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
21f0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
2200: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
2210: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
2220: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
2230: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
2240: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
2250: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
2260: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
2270: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
2280: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
2290: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
22a0: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
22b0: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
22c0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
22d0: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
22e0: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
22f0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
2300: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
2310: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76  _TO_DATA(P)  ((v
2320: 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a  oid*)(&(P)[1])).
2330: 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f  #define DATA_TO_
2340: 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67  PGHDR(D)  (&((Pg
2350: 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23  Hdr*)(D))[-1]).#
2360: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
2370: 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69  EXTRA(G,P) ((voi
2380: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47  d*)&((char*)(&(G
2390: 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65  )[1]))[(P)->page
23a0: 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50  Size]).#define P
23b0: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
23c0: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
23d0: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
23e0: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
23f0: 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53  ]))[(PGR)->pageS
2400: 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ize+(PGR)->nExtr
2410: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  a])../*.** A ope
2420: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
2430: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
2440: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
2450: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
2460: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
2470: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
2480: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
2490: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
24a0: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
24b0: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
24c0: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
24d0: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
24e0: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
24f0: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
2500: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
2510: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
2520: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
2530: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
2540: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
2550: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
2560: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
2570: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
2580: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
2590: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
25a0: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
25b0: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
25c0: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
25d0: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
25e0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
25f0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
2600: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
2610: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
2620: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
2630: 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ully..*/.struct 
2640: 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75  Pager {.  u8 jou
2650: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
2660: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2670: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
2680: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
2690: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
26a0: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
26c0: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
26d0: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
26e0: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
2700: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
2710: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
2720: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
2730: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
2740: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
2750: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
2760: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
2770: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
2780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2790: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
27a0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
27b0: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
27c0: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
27d0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
27e0: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
27f0: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
2800: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
2810: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
2820: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
2830: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
2840: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
2850: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
2860: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2870: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2880: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
2890: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
28a0: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
28b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
28c0: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
28d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
28e0: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
28f0: 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20  8 full_fsync;   
2900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2910: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68  e F_FULLFSYNC wh
2920: 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  en available */.
2930: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2950: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
2960: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
2970: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
2980: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
2990: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
29a0: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
29b0: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
29c0: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29e0: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
29f0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
2a00: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
2a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a20: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
2a30: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
2a40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
2a50: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a70: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
2a80: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
2a90: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
2aa0: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2ab0: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
2ac0: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
2ad0: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2ae0: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b00: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
2b10: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
2b20: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b40: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
2b50: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
2b60: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
2b70: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b90: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
2ba0: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
2bb0: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
2bc0: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
2bd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2be0: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
2bf0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
2c00: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
2c10: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2c20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2c30: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2c40: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2c50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
2c60: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
2c70: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2c80: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
2c90: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
2ca0: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
2cb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2cc0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2cd0: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
2ce0: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
2cf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
2d00: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
2d10: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
2d20: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
2d30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d40: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
2d50: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
2d60: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
2d70: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2da0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
2db0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2dc0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
2dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
2de0: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
2df0: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
2e00: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
2e10: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
2e20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e30: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
2e40: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
2e50: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
2e60: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2e70: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
2e80: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
2e90: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
2ea0: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
2eb0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2ec0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2ed0: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
2ee0: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2f10: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
2f20: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  es */.  int nMax
2f30: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2f40: 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65      /* High wate
2f50: 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20  r mark of nPage 
2f60: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
2f90: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
2fa0: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
2fb0: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2fe0: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
2ff0: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
3000: 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c    u8 *aInJournal
3010: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3020: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
3030: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
3040: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
3050: 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20   u8 *aInStmt;   
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3070: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
3080: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
3090: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
30a0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
30b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
30c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
30d0: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
30e0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
30f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
3100: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3110: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
3120: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
3130: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
3140: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
3150: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
3160: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20  /.  OsFile *fd, 
3170: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
3180: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
3190: 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  ors for database
31a0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   and journal */.
31b0: 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20    OsFile *stfd; 
31c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31d0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
31e0: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
31f0: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a  nt subjournal*/.
3200: 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70    BusyHandler *p
3210: 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a  BusyHandler;  /*
3220: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
3230: 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a  te.busyHandler *
3240: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
3250: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
3260: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
3270: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
3280: 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20   *pFirstSynced; 
3290: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
32a0: 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50  free page with P
32b0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30  gHdr.needSync==0
32c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
32d0: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
32e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
32f0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3300: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
3310: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3320: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3330: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3340: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
3350: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
3360: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3370: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
3380: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3390: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
33a0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
33b0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
33c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
33d0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
33e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
33f0: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
3400: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
3410: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
3420: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
3430: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3440: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
3450: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
3460: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
3470: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
3480: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
3490: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
34a0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
34b0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
34c0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
34d0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
34e0: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
34f0: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
3500: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
3510: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
3520: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
3530: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
3540: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3550: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3560: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
3570: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
3580: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
3590: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
35a0: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
35b0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
35c0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
35d0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
35e0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
35f0: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
3600: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
3610: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3620: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
3630: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
3640: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
3650: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
3660: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3670: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
3680: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78  s */.  void *(*x
3690: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
36a0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
36b0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
36c0: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
36d0: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
36e0: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
36f0: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3700: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3710: 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20    int nHash;    
3720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3730: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
3740: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  er hash table */
3750: 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68  .  PgHdr **aHash
3760: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3770: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
3780: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
3790: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64  to PgHdr */.#ifd
37a0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
37b0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
37c0: 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78  NT.  Pager *pNex
37d0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
37e0: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
37f0: 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68 69  of pagers in thi
3800: 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64  s thread */.#end
3810: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
3820: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
3830: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
3840: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
3850: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
3860: 0a 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f  .  u32 iChangeCo
3870: 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  unt;           /
3880: 2a 20 44 62 20 63 68 61 6e 67 65 2d 63 6f 75 6e  * Db change-coun
3890: 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 63 61  ter for which ca
38a0: 63 68 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  che is valid */.
38b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c  };../*.** If SQL
38c0: 49 54 45 5f 54 45 53 54 20 69 73 20 64 65 66 69  ITE_TEST is defi
38d0: 6e 65 64 20 74 68 65 6e 20 69 6e 63 72 65 6d 65  ned then increme
38e0: 6e 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  nt the variable 
38f0: 67 69 76 65 6e 20 69 6e 0a 2a 2a 20 74 68 65 20  given in.** the 
3900: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 23 69 66 64  argument.*/.#ifd
3910: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23  ef SQLITE_TEST.#
3920: 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e 43   define TEST_INC
3930: 52 28 78 29 20 20 78 2b 2b 0a 23 65 6c 73 65 0a  R(x)  x++.#else.
3940: 23 20 64 65 66 69 6e 65 20 54 45 53 54 5f 49 4e  # define TEST_IN
3950: 43 52 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CR(x).#endif../*
3960: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
3970: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
3980: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
3990: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
39a0: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
39b0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
39c0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
39d0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
39e0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
39f0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
3a00: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
3a10: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
3a20: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
3a30: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
3a40: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
3a50: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
3a60: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
3a70: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
3a80: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
3a90: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
3aa0: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
3ab0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
3ac0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
3ad0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
3ae0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
3af0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
3b00: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
3b10: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
3b20: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
3b30: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
3b40: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
3b50: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
3b60: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
3b70: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
3b80: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
3b90: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
3ba0: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
3bb0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
3bc0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
3bd0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
3be0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
3bf0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
3c00: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
3c10: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
3c20: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
3c30: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
3c40: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
3c50: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
3c60: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
3c70: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
3c80: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
3c90: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
3ca0: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
3cb0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
3cc0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
3cd0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
3ce0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
3cf0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
3d00: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
3d10: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
3d20: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
3d30: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
3d40: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
3d50: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
3d60: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
3d70: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
3d80: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
3d90: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
3da0: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
3db0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
3dc0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
3dd0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
3de0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
3df0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
3e00: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
3e10: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
3e20: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
3e30: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
3e40: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
3e50: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
3e60: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
3e70: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
3e80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
3e90: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
3ea0: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
3eb0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
3ec0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
3ed0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
3ee0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
3ef0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
3f00: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
3f10: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
3f20: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
3f30: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
3f40: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
3f50: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
3f60: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
3f70: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
3f80: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
3f90: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
3fa0: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
3fb0: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
3fc0: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
3fd0: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
3fe0: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
3ff0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
4000: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
4010: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
4020: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
4030: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
4040: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
4050: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
4060: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
4070: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
4080: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4090: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
40a0: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
40b0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
40c0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
40d0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
40e0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
40f0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
4100: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
4110: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
4120: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
4130: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
4140: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
4150: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
4160: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
4170: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
4180: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
41a0: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
41b0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
41c0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
41d0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
41e0: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
41f0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
4200: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
4210: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
4220: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
4230: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
4240: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
4250: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
4260: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
4270: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
4280: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
4290: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
42a0: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
42b0: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
42c0: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
42d0: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
42e0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
42f0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
4300: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
4310: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
4320: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
4330: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
4340: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
4350: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
4360: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
4370: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
4380: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
4390: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
43a0: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
43b0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
43c0: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
43d0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
43e0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
43f0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
4400: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4410: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4420: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 45  7483647../*.** E
4430: 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63 65 20  nable reference 
4440: 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67 20 28  count tracking (
4450: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29 20 68  for debugging) h
4460: 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ere:.*/.#ifdef S
4470: 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
4480: 20 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f   pager3_refinfo_
4490: 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20 20 73 74  enable = 0;.  st
44a0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
44b0: 72 65 66 69 6e 66 6f 28 50 67 48 64 72 20 2a 70  refinfo(PgHdr *p
44c0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 69 6e  ){.    static in
44d0: 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69  t cnt = 0;.    i
44e0: 66 28 20 21 70 61 67 65 72 33 5f 72 65 66 69 6e  f( !pager3_refin
44f0: 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72 65 74 75  fo_enable ) retu
4500: 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  rn;.    sqlite3D
4510: 65 62 75 67 50 72 69 6e 74 66 28 0a 20 20 20 20  ebugPrintf(.    
4520: 20 20 20 22 52 45 46 43 4e 54 3a 20 25 34 64 20     "REFCNT: %4d 
4530: 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 2d 33  addr=%p nRef=%-3
4540: 64 20 74 6f 74 61 6c 3d 25 64 5c 6e 22 2c 0a 20  d total=%d\n",. 
4550: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
4560: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
4570: 20 70 2d 3e 6e 52 65 66 2c 20 70 2d 3e 70 50 61   p->nRef, p->pPa
4580: 67 65 72 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  ger->nRef.    );
4590: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
45a0: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
45b0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
45c0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
45d0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
45e0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
45f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
4600: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
4610: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
4620: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 70  he size of the p
4630: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4640: 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20 62 65  to N.  N must be
4650: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66 20 74   a power.** of t
4660: 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  wo..*/.static vo
4670: 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f  id pager_resize_
4680: 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67 65 72  hash_table(Pager
4690: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 29   *pPager, int N)
46a0: 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73  {.  PgHdr **aHas
46b0: 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73 65 72  h, *pPg;.  asser
46c0: 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28 4e 2d  t( N>0 && (N&(N-
46d0: 31 29 29 3d 3d 30 20 29 3b 0a 20 20 61 48 61 73  1))==0 );.  aHas
46e0: 68 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  h = sqliteMalloc
46f0: 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30  ( sizeof(aHash[0
4700: 5d 29 2a 4e 20 29 3b 0a 20 20 69 66 28 20 61 48  ])*N );.  if( aH
4710: 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  ash==0 ){.    /*
4720: 20 46 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61   Failure to reha
4730: 73 68 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72  sh is not an err
4740: 6f 72 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20  or.  It is only 
4750: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69  a performance hi
4760: 74 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  t. */.    return
4770: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4780: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
4790: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
47a0: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
47b0: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
47c0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
47d0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
47e0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
47f0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
4800: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
4810: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
4820: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
4830: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
4840: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
4850: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
4860: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
4870: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
4880: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
4890: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
48a0: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
48b0: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
48c0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
48d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
48e0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
48f0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
4900: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
4910: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4920: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
4930: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4940: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
4950: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
4960: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
4970: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
4980: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
4990: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
49a0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
49b0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
49c0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
49d0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
49e0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
49f0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
4a00: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
4a10: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4a20: 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75   u32 *pRes){.  u
4a30: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4a40: 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  4];.  int rc = s
4a50: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4a60: 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 29   ac, sizeof(ac))
4a70: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
4a80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52  TE_OK ){.    *pR
4a90: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4aa0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4ab0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4ac0: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  [3];.  }.  retur
4ad0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
4ae0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4af0: 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72  teger into a str
4b00: 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69  ing buffer in bi
4b10: 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72  g-endian byte or
4b20: 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  der..*/.static v
4b30: 6f 69 64 20 70 75 74 33 32 62 69 74 73 28 63 68  oid put32bits(ch
4b40: 61 72 20 2a 61 63 2c 20 75 33 32 20 76 61 6c 29  ar *ac, u32 val)
4b50: 7b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  {.  ac[0] = (val
4b60: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4b70: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
4b80: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
4b90: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
4ba0: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4bb0: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4bc0: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
4bd0: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
4be0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
4bf0: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
4c00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
4c10: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
4c20: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
4c30: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
4c40: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
4c50: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 4f  nt write32bits(O
4c60: 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76  sFile *fd, u32 v
4c70: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4c80: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4c90: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4ca0: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4cb0: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4cc0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4cd0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
4ce0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
4cf0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4d00: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4d10: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4d20: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4d30: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4d40: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4d50: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4d60: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4d70: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4d80: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4d90: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
4da0: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
4db0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4dc0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4dd0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  [3];.}.../*.** T
4de0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f  his function sho
4df0: 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68  uld be called wh
4e00: 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  en an error occu
4e10: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 70 61  rs within the pa
4e20: 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65  ger.** code. The
4e30: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
4e40: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
4e50: 74 68 65 20 70 61 67 65 72 20 73 74 72 75 63 74  the pager struct
4e60: 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f  ure, the.** seco
4e70: 6e 64 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64  nd the error-cod
4e80: 65 20 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65  e about to be re
4e90: 74 75 72 6e 65 64 20 62 79 20 61 20 70 61 67 65  turned by a page
4ea0: 72 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20  r API function. 
4eb0: 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65  .** The value re
4ec0: 74 75 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79  turned is a copy
4ed0: 20 6f 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   of the second a
4ee0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
4ef0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a  function. .**.**
4f00: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
4f10: 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54  rgument is SQLIT
4f20: 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
4f30: 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49  CORRUPT, or SQLI
4f40: 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65  TE_FULL.** the e
4f50: 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72  rror becomes per
4f60: 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62  sistent. All sub
4f70: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
4f80: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a  s on this Pager.
4f90: 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  ** will immediat
4fa0: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
4fb0: 61 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ame error code..
4fc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
4fd0: 67 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20  ger_error(Pager 
4fe0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29  *pPager, int rc)
4ff0: 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63  {.  int rc2 = rc
5000: 20 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72   & 0xff;.  asser
5010: 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  t( pPager->errCo
5020: 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de==SQLITE_FULL 
5030: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
5040: 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  de==SQLITE_OK );
5050: 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d  .  if(.    rc2==
5060: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
5070: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
5080: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
5090: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a  =SQLITE_CORRUPT.
50a0: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
50b0: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
50c0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
50d0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
50e0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
50f0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
5100: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
5110: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
5120: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
5130: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
5140: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
5150: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
5160: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5170: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 20  ned char *pData 
5180: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
5190: 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   *)PGHDR_TO_DATA
51a0: 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69  (pPage);.  for(i
51b0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61  =0; i<pPage->pPa
51c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69  ger->pageSize; i
51d0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
51e0: 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69  (hash+i)^pData[i
51f0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
5200: 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hash;.}../*.** T
5210: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
5220: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
5230: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
5240: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
5250: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
5260: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
5270: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
5280: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
5290: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
52a0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
52b0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
52c0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
52d0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
52e0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
52f0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
5300: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
5310: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
5320: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
5330: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
5340: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
5350: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
5360: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
5370: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
5380: 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d  || MEMDB || pPg-
5390: 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20  >dirty || .     
53a0: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
53b0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
53c0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
53d0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
53e0: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
53f0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
5400: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
5410: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
5420: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
5430: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
5440: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
5450: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
5460: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
5470: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
5480: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
5490: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
54a0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
54b0: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
54c0: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
54d0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
54e0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
54f0: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
5500: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
5510: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
5520: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
5530: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5540: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
5550: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
5560: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
5570: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
5580: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5590: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
55a0: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
55b0: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
55c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
55d0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
55e0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
55f0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
5600: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5610: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5620: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5630: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5640: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5650: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5660: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5670: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5680: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
5690: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
56a0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
56b0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
56c0: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
56d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
56e0: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
56f0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
5700: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
5710: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5720: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5730: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5740: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5750: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5760: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5770: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5780: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5790: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
57a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
57b0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
57c0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
57d0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
57e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
57f0: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
5800: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5820: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5830: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5840: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5850: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5860: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5870: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5880: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5890: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
58a0: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
58b0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
58c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
58d0: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
58e0: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
58f0: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
5900: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5910: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5920: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5930: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5940: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5950: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5960: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5970: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5980: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5990: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
59a0: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
59b0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
59c0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
59d0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
59e0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
59f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5a00: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5a10: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5a20: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5a30: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5a40: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5a50: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5a60: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5a70: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5a80: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5a90: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5aa0: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
5ab0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
5ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
5ad0: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
5ae0: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
5af0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5b00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5b10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5b20: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5b30: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5b40: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5b50: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5b60: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5b70: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5b80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
5b90: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
5ba0: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
5bb0: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
5bc0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
5bd0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
5be0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
5bf0: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
5c00: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
5c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5c30: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
5c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
5c50: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
5c60: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5c70: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5c90: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
5cb0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
5cc0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
5cd0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
5ce0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
5cf0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
5d00: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5d10: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5d20: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5d30: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5d40: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5d50: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5d60: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5d70: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5d80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5d90: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5da0: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
5db0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
5dc0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
5dd0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
5de0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
5df0: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
5e00: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5e10: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
5e20: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
5e30: 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nalOff);.}../*.*
5e40: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
5e50: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
5e60: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
5e70: 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a  e is called. A j
5e80: 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72  ournal.** header
5e90: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5ea0: 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74   bytes) is writt
5eb0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
5ec0: 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a  nal file at the.
5ed0: 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  ** current locat
5ee0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ion..**.** The f
5ef0: 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f  ormat for the jo
5f00: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
5f10: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d  as follows:.** -
5f20: 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20   8 bytes: Magic 
5f30: 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72  identifying jour
5f40: 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d  nal format..** -
5f50: 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72   4 bytes: Number
5f60: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a   of records in j
5f70: 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f  ournal, or -1 no
5f80: 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e  -sync mode is on
5f90: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5fa0: 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73  Random number us
5fb0: 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68  ed for page hash
5fc0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5fd0: 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  Initial database
5fe0: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20   page count..** 
5ff0: 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f  - 4 bytes: Secto
6000: 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  r size used by t
6010: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6020: 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e  wrote this journ
6030: 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f  al..** .** Follo
6040: 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f  wed by (JOURNAL_
6050: 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74  HDR_SZ - 24) byt
6060: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
6070: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ce..*/.static in
6080: 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  t writeJournalHd
6090: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
60a0: 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65 72  {.  char zHeader
60b0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
60c0: 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e  Magic)+16];.  in
60d0: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61  t rc;..  if( pPa
60e0: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
60f0: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
6100: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
6110: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6120: 66 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  f;.  }..  rc = s
6130: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6140: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6150: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6160: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
6170: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
6180: 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65  rnalOff;.  pPage
6190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
61a0: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
61b0: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
61c0: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
61d0: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
61e0: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
61f0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
6200: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
6210: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
6220: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
6230: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
6240: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
6250: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
6260: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
6270: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
6280: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
6290: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
62a0: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
62b0: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
62c0: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
62d0: 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 7a 48 65 61  */.  memcpy(zHea
62e0: 64 65 72 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  der, aJournalMag
62f0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
6300: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 2f 2a  nalMagic));.  /*
6310: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
6320: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
6330: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
6340: 2e 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  . */.  put32bits
6350: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6360: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
6370: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
6380: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
6390: 30 29 3b 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e  0);.  /* The ran
63a0: 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69  dom check-hash i
63b0: 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20  nitialiser */ . 
63c0: 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65   sqlite3Randomne
63d0: 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ss(sizeof(pPager
63e0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70  ->cksumInit), &p
63f0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6400: 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  );.  put32bits(&
6410: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
6420: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d  JournalMagic)+4]
6430: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
6440: 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69  nit);.  /* The i
6450: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
6460: 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62  size */.  put32b
6470: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
6480: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6490: 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64  c)+8], pPager->d
64a0: 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65  bSize);.  /* The
64b0: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   assumed sector 
64c0: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72  size for this pr
64d0: 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32  ocess */.  put32
64e0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
64f0: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6500: 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d  ic)+12], pPager-
6510: 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20  >sectorSize);.  
6520: 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
6530: 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
6540: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  ager, pPager->jo
6550: 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f 66  urnalHdr, sizeof
6560: 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72 63  (zHeader))).  rc
6570: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6580: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6590: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
65a0: 48 65 61 64 65 72 29 29 3b 0a 0a 20 20 2f 2a 20  Header));..  /* 
65b0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
65c0: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
65d0: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
65e0: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
65f0: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
6600: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
6610: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
6620: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
6630: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
6640: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6650: 20 49 4f 54 52 41 43 45 28 28 22 4a 54 41 49 4c   IOTRACE(("JTAIL
6660: 20 25 70 20 25 6c 6c 64 5c 6e 22 2c 20 70 50 61   %p %lld\n", pPa
6670: 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ger, pPager->jou
6680: 72 6e 61 6c 4f 66 66 2d 31 29 29 0a 20 20 20 20  rnalOff-1)).    
6690: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
66a0: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
66b0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
66c0: 66 66 2d 31 29 3b 0a 20 20 20 20 69 66 28 20 72  ff-1);.    if( r
66d0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
66e0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
66f0: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
6700: 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31  ->jfd, "\000", 1
6710: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
6720: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
6730: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
6740: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
6750: 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   when this is ca
6760: 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20  lled. A journal 
6770: 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28  header file.** (
6780: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62  JOURNAL_HDR_SZ b
6790: 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72  ytes) is read fr
67a0: 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  om the current l
67b0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a  ocation in the j
67c0: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20  ournal.** file. 
67d0: 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f  See comments abo
67e0: 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  ve function writ
67f0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f  eJournalHdr() fo
6800: 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20  r a description 
6810: 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  of.** the journa
6820: 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e  l header format.
6830: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65  .**.** If the he
6840: 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63  ader is read suc
6850: 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63  cessfully, *nRec
6860: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
6870: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65  umber of.** page
6880: 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69   records followi
6890: 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61  ng this header a
68a0: 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65  nd *dbSize is se
68b0: 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  t to the size of
68c0: 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
68d0: 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
68e0: 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69  saction began, i
68f0: 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70  n pages. Also, p
6900: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
6910: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68  .** is set to th
6920: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
6930: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  m the journal he
6940: 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20  ader. SQLITE_OK 
6950: 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69  is returned.** i
6960: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
6970: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
6980: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70  l header file ap
6990: 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72  pears to be corr
69a0: 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f  upted, SQLITE_DO
69b0: 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  NE is.** returne
69c0: 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20  d and *nRec and 
69d0: 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20  *dbSize are not 
69e0: 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c  set.  If JOURNAL
69f0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a  _HDR_SZ bytes.**
6a00: 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20   cannot be read 
6a10: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6a20: 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63   file an error c
6a30: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6a50: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20  eadJournalHdr(. 
6a60: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
6a70: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69  .  i64 journalSi
6a80: 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63  ze,.  u32 *pNRec
6a90: 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a  , .  u32 *pDbSiz
6aa0: 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e.){.  int rc;. 
6ab0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
6ac0: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
6ad0: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
6ae0: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
6af0: 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  /..  rc = seekJo
6b00: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6b10: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6b20: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70  urn rc;..  if( p
6b30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6b40: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
6b50: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
6b60: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
6b70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
6b80: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
6b90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
6ba0: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
6bb0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
6bc0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6bd0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
6be0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
6bf0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6c00: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
6c10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6c20: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6c30: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6c40: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  s(pPager->jfd, p
6c50: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
6c60: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6c70: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6c80: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
6c90: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6ca0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6cb0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6cc0: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
6cd0: 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29  r->jfd, pDbSize)
6ce0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6cf0: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70  urn rc;..  /* Up
6d00: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
6d10: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
6d20: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
6d30: 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68  used by .  ** th
6d40: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  e process that c
6d50: 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72  reated this jour
6d60: 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75  nal. If this jou
6d70: 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72  rnal was.  ** cr
6d80: 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
6d90: 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ss other than th
6da0: 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69  is one, then thi
6db0: 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69  s routine.  ** i
6dc0: 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66  s being called f
6dd0: 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72  rom within pager
6de0: 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65  _playback(). The
6df0: 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a   local value.  *
6e00: 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f  * of Pager.secto
6e10: 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65  rSize is restore
6e20: 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
6e30: 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20  that routine..  
6e40: 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  */.  rc = read32
6e50: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6e60: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
6e70: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
6e80: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6e90: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
6ea0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
6eb0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6ec0: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
6ed0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
6ee0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
6ef0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72  journalOff);.  r
6f00: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
6f10: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
6f20: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
6f30: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
6f40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6f50: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
6f60: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
6f70: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
6f80: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6f90: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
6fa0: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
6fb0: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
6fc0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
6fd0: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
6fe0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
6ff0: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
7000: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
7010: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
7020: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
7030: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
7040: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
7050: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
7060: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
7070: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
7080: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
7090: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
70a0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
70b0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
70c0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
70d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
70e0: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
70f0: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
7100: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
7110: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
7120: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
7130: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
7140: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
7150: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
7160: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
7170: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
7180: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
7190: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
71a0: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
71b0: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
71c0: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
71d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
71e0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
71f0: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
7200: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
7210: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
7220: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
7230: 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b  int i; .  u32 ck
7240: 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  sum = 0;.  char 
7250: 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  zBuf[sizeof(aJou
7260: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b  rnalMagic)+2*4];
7270: 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72  ..  if( !zMaster
7280: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d   || pPager->setM
7290: 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51  aster) return SQ
72a0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
72b0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31  r->setMaster = 1
72c0: 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65  ;..  len = strle
72d0: 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f  n(zMaster);.  fo
72e0: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
72f0: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d  +){.    cksum +=
7300: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d   zMaster[i];.  }
7310: 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c  ..  /* If in ful
7320: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76  l-sync mode, adv
7330: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
7340: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66   disk sector bef
7350: 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a  ore writing.  **
7360: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
7370: 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69  nal name. This i
7380: 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72  s in case the pr
7390: 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74  evious page writ
73a0: 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ten to.  ** the 
73b0: 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65  journal has alre
73c0: 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e  ady been synced.
73d0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
73e0: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
73f0: 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75      rc = seekJou
7400: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
7410: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
7420: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7430: 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  rc;.  }.  pPager
7440: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7450: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
7460: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
7470: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
7480: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
7490: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
74a0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
74b0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
74c0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
74d0: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
74e0: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
74f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7500: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 75 74 33 32  urn rc;..  put32
7510: 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b  bits(zBuf, len);
7520: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 42  .  put32bits(&zB
7530: 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20  uf[4], cksum);. 
7540: 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d   memcpy(&zBuf[8]
7550: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7560: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
7570: 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d 20  Magic));.  rc = 
7580: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
7590: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66  Pager->jfd, zBuf
75a0: 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  , 8+sizeof(aJour
75b0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50  nalMagic));.  pP
75c0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
75d0: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
75e0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
75f0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72  ../*.** Add or r
7600: 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f  emove a page fro
7610: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  m the list of al
7620: 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  l pages that are
7630: 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65   in the.** state
7640: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  ment journal..**
7650: 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65  .** The Pager ke
7660: 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c  eps a separate l
7670: 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61  ist of pages tha
7680: 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  t are currently 
7690: 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d  in.** the statem
76a0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ent journal.  Th
76b0: 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c  is helps the sql
76c0: 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
76d0: 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  mit().** routine
76e0: 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65 72   run MUCH faster
76f0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20   for the common 
7700: 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72 65  case where there
7710: 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61 67   are many.** pag
7720: 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75 74  es in memory but
7730: 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65 20   only a few are 
7740: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
7750: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
7760: 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61 64  tic void page_ad
7770: 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 50  d_to_stmt_list(P
7780: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
7790: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
77a0: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28  g->pPager;.  if(
77b0: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72   pPg->inStmt ) r
77c0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
77d0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3d   pPg->pPrevStmt=
77e0: 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78 74  =0 && pPg->pNext
77f0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 67  Stmt==0 );.  pPg
7800: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
7810: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70  .  if( pPager->p
7820: 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61 67  Stmt ){.    pPag
7830: 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65 76  er->pStmt->pPrev
7840: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Stmt = pPg;.  }.
7850: 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74    pPg->pNextStmt
7860: 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74   = pPager->pStmt
7870: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  ;.  pPager->pStm
7880: 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  t = pPg;.  pPg->
7890: 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74  inStmt = 1;.}.st
78a0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72  atic void page_r
78b0: 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f  emove_from_stmt_
78c0: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
78d0: 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  {.  if( !pPg->in
78e0: 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20  Stmt ) return;. 
78f0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 53   if( pPg->pPrevS
7900: 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  tmt ){.    asser
7910: 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d  t( pPg->pPrevStm
7920: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70 50  t->pNextStmt==pP
7930: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
7940: 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74  revStmt->pNextSt
7950: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
7960: 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  tmt;.  }else{.  
7970: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
7980: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70 50  Pager->pStmt==pP
7990: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
79a0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
79b0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
79c0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
79d0: 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  xtStmt ){.    as
79e0: 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
79f0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Stmt->pPrevStmt=
7a00: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7a10: 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65  >pNextStmt->pPre
7a20: 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50 72  vStmt = pPg->pPr
7a30: 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70 50  evStmt;.  }.  pP
7a40: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
7a50: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
7a60: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 69  mt = 0;.  pPg->i
7a70: 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nStmt = 0;.}../*
7a80: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
7a90: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
7aa0: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
7ab0: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
7ac0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
7ad0: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
7ae0: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
7af0: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
7b00: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
7b10: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
7b20: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
7b30: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
7b40: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
7b50: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
7b60: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
7b70: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
7b80: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
7b90: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
7ba0: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
7bb0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
7bc0: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
7bd0: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
7be0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
7bf0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
7c00: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
7c10: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
7c20: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
7c30: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
7c40: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
7c50: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
7c60: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
7c70: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70  O_LOCK);.      p
7c80: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
7c90: 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  -1;.      IOTRAC
7ca0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
7cb0: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d  , pPager)).    }
7cc0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
7cd0: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
7ce0: 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  K;.    pPager->c
7cf0: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
7d00: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7d10: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
7d20: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
7d30: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
7d40: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
7d50: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
7d60: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
7d70: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
7d80: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
7d90: 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73  d.** the error-s
7da0: 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tate..*/.static 
7db0: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
7dc0: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
7dd0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
7de0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
7df0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
7e00: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
7e10: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
7e20: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69  alOpen==0 );.  i
7e30: 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  f( p->state>=PAG
7e40: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
7e50: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
7e60: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
7e70: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
7e80: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
7e90: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
7ea0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
7eb0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
7ec0: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
7ed0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
7ee0: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
7ef0: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
7f00: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
7f10: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  }.../*.** Unlock
7f20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
7f30: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
7f40: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
7f50: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
7f60: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
7f70: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
7f80: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
7f90: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
7fa0: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
7fb0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
7fc0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7fd0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
7fe0: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
7ff0: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
8000: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
8010: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
8020: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
8030: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
8040: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
8050: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
8060: 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67  Next;.  if( pPag
8070: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 20 72 65  er->errCode ) re
8080: 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d  turn;.  for(pPg=
8090: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
80a0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
80b0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
80c0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
80d0: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
80e0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74   }.  pPager->pSt
80f0: 6d 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  mt = 0;.  pPager
8100: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
8110: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
8120: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
8130: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
8140: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
8150: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  0;.  pPager->nHa
8160: 73 68 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  sh = 0;.  sqlite
8170: 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61  Free(pPager->aHa
8180: 73 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  sh);.  pPager->n
8190: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
81a0: 65 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20  er->aHash = 0;. 
81b0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
81c0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  0;.}../*.** This
81d0: 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20   routine ends a 
81e0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20  transaction.  A 
81f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
8200: 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a  nded by either.*
8210: 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  * a COMMIT or a 
8220: 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20  ROLLBACK..**.** 
8230: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
8240: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
8250: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
8260: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8270: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
8280: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
8290: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
82a0: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
82b0: 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  ine will release
82c0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
82d0: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
82e0: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
82f0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66   in its place if
8300: 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20   that is.** the 
8310: 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e  appropriate thin
8320: 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73  g to do.  Releas
8330: 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20  e locks usually 
8340: 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a  is appropriate,.
8350: 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65  ** unless we are
8360: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
8370: 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c  cess mode or unl
8380: 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a  ess this is a .*
8390: 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47  * COMMIT AND BEG
83a0: 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41  IN or ROLLBACK A
83b0: 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69  ND BEGIN operati
83c0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f  on..**.** The jo
83d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69  urnal file is ei
83e0: 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20  ther deleted or 
83f0: 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  truncated..**.**
8400: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
8410: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
8420: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
8430: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
8440: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
8450: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
8460: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
8470: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
8480: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
8490: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
84a0: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
84b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
84c0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
84d0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
84e0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
84f0: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
8500: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
8510: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
8520: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
8530: 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
8540: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
8550: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
8560: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8570: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
8580: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
8590: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
85a0: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26  ger->stmtOpen &&
85b0: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
85c0: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73  iveMode ){.    s
85d0: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
85e0: 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
85f0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
8600: 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  en = 0;.  }.  if
8610: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
8620: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28  lOpen ){.    if(
8630: 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
8640: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  veMode ){.      
8650: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8660: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
8670: 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  fd, 0);.      sq
8680: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
8690: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
86a0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
86b0: 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
86c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
86d0: 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20  Started = 0;.   
86e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
86f0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
8700: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
8710: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8720: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20  lOpen = 0;.     
8730: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
8740: 20 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 72   temporary pager
8750: 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20   file, then the 
8760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 68 6f  journal file sho
8770: 75 6c 64 0a 20 20 20 20 20 20 2a 2a 20 68 61 76  uld.      ** hav
8780: 65 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65  e been configure
8790: 64 20 61 73 20 64 65 6c 65 74 65 2d 6f 6e 2d 63  d as delete-on-c
87a0: 6c 6f 73 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  lose. Otherwise,
87b0: 20 69 74 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c   it should still
87c0: 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 69 6e 20  .      ** be in 
87d0: 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  the file system.
87e0: 20 54 68 69 73 20 70 61 67 65 72 20 73 74 69 6c   This pager stil
87f0: 6c 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56  l holds a RESERV
8800: 45 44 20 6f 72 20 67 72 65 61 74 65 72 0a 20 20  ED or greater.  
8810: 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74      ** lock on t
8820: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
8830: 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f  , so there is no
8840: 20 63 68 61 6e 63 65 20 61 6e 6f 74 68 65 72 20   chance another 
8850: 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
8860: 20 63 6f 75 6c 64 20 63 72 65 61 74 65 20 6f 72   could create or
8870: 20 72 65 6d 6f 76 65 20 61 20 6a 6f 75 72 6e 61   remove a journa
8880: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  l file..      **
8890: 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 73 65 20  .      ** These 
88a0: 61 73 73 65 72 74 73 20 61 72 65 20 6e 6f 74 20  asserts are not 
88b0: 76 61 6c 69 64 20 66 6f 72 20 61 73 79 6e 63 68  valid for asynch
88c0: 72 6f 6e 6f 75 73 20 49 2f 4f 20 73 75 63 68 20  ronous I/O such 
88d0: 61 73 20 69 73 20 66 6f 75 6e 64 0a 20 20 20 20  as is found.    
88e0: 20 20 2a 2a 20 69 6e 20 61 73 79 6e 63 2e 74 65    ** in async.te
88f0: 73 74 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  st.      */.    
8900: 20 20 2f 2a 61 73 73 65 72 74 28 20 73 71 6c 69    /*assert( sqli
8910: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
8920: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8930: 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d  ) || pPager->tem
8940: 70 46 69 6c 65 20 29 3b 2a 2f 0a 20 20 20 20 20  pFile );*/.     
8950: 20 2f 2a 61 73 73 65 72 74 28 20 21 73 71 6c 69   /*assert( !sqli
8960: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
8970: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
8980: 29 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 74 65  ) || !pPager->te
8990: 6d 70 46 69 6c 65 20 29 3b 2a 2f 0a 20 20 20 20  mpFile );*/.    
89a0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
89b0: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
89c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
89d0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
89e0: 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  zJournal);.     
89f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
8a00: 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
8a10: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >aInJournal );. 
8a20: 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
8a30: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66  urnal = 0;.    f
8a40: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
8a50: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
8a60: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
8a70: 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
8a80: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
8a90: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
8aa0: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
8ab0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
8ac0: 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
8ad0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
8ae0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8af0: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
8b00: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
8b10: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
8b20: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
8b30: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
8b40: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
8b50: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
8b60: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
8b70: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
8b80: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
8b90: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
8ba0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
8bb0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
8bc0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
8bd0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
8be0: 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
8bf0: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
8c00: 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c  ){.    rc2 = sql
8c10: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61  ite3OsUnlock(pPa
8c20: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
8c30: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
8c40: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
8c50: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
8c60: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
8c70: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
8c80: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
8c90: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
8ca0: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
8cb0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
8cc0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
8cd0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
8ce0: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
8cf0: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
8d00: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
8d10: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b   pPager->pFirst;
8d20: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
8d30: 65 20 3d 20 2d 31 3b 0a 0a 20 20 72 65 74 75 72  e = -1;..  retur
8d40: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
8d50: 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a  ?rc2:rc);.}../*.
8d60: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72  ** Compute and r
8d70: 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d  eturn a checksum
8d80: 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66   for the page of
8d90: 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   data..**.** Thi
8da0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
8db0: 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73  checksum.  It is
8dc0: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65   really just the
8dd0: 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20   sum of the .** 
8de0: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76  random initial v
8df0: 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67  alue and the pag
8e00: 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78  e number.  We ex
8e10: 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a  perimented with.
8e20: 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66  ** a checksum of
8e30: 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61   the entire data
8e40: 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66  , but that was f
8e50: 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73  ound to be too s
8e60: 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  low..**.** Note 
8e70: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
8e80: 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61  mber is stored a
8e90: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
8ea0: 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74  of data and.** t
8eb0: 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73  he checksum is s
8ec0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
8ed0: 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72  .  This is impor
8ee0: 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61  tant.  If journa
8ef0: 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20  l.** corruption 
8f00: 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20  occurs due to a 
8f10: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
8f20: 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73  he most likely s
8f30: 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68  cenario.** is th
8f40: 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68  at one end or th
8f50: 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72  e other of the r
8f60: 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68  ecord will be ch
8f70: 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a  anged.  It is.**
8f80: 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c   much less likel
8f90: 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65  y that the two e
8fa0: 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nds of the journ
8fb0: 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62  al record will b
8fc0: 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64  e.** correct and
8fd0: 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63   the middle be c
8fe0: 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74  orrupt.  Thus, t
8ff0: 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73  his "checksum" s
9000: 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68  cheme,.** though
9010: 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65   fast and simple
9020: 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f  , catches the mo
9030: 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64  stly likely kind
9040: 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a   of corruption..
9050: 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43  **.** FIX ME:  C
9060: 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65  onsider adding e
9070: 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73  very 200th (or s
9080: 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64  o) byte of the d
9090: 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68  ata to the.** ch
90a0: 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61  ecksum.  That wa
90b0: 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61  y if a single pa
90c0: 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f  ge spans 3 or mo
90d0: 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20  re disk sectors 
90e0: 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20  and.** only the 
90f0: 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73  middle sector is
9100: 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c   corrupt, we wil
9110: 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72  l still have a r
9120: 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61  easonable.** cha
9130: 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74  nce of failing t
9140: 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20  he checksum and 
9150: 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74  thus detecting t
9160: 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73  he problem..*/.s
9170: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
9180: 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61  cksum(Pager *pPa
9190: 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61  ger, const u8 *a
91a0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
91b0: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
91c0: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
91d0: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
91e0: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
91f0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
9200: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
9210: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
9220: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
9230: 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
9240: 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
9250: 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
9260: 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a  ean(PgHdr*);../*
9270: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
9280: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
9290: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
92a0: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
92b0: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
92c0: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
92d0: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
92e0: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
92f0: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
9300: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
9310: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
9320: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
9330: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
9340: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
9350: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
9360: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
9370: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
9380: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
9390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
93a0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
93b0: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
93c0: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
93d0: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
93e0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
93f0: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
9400: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9410: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
9420: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
9430: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
9460: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
9470: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
9480: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
9490: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
94a0: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
94b0: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
94c0: 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d  */.  u8 *aData =
94d0: 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70   (u8 *)pPager->p
94e0: 54 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54  TmpSpace;   /* T
94f0: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
9500: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
9510: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
9520: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
9530: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
9540: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
9550: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
9560: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
9570: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
9580: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
9590: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
95a0: 75 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65  useCksum ? pPage
95b0: 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d  r->jfd : pPager-
95c0: 3e 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65  >stfd) );.  asse
95d0: 72 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20  rt( aData );..  
95e0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
95f0: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
9600: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9610: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
9620: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
9630: 61 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70  ad(jfd, aData, p
9640: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9650: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9660: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
9670: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
9680: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
9690: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
96a0: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
96b0: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
96c0: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
96d0: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
96e0: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
96f0: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
9700: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
9710: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
9720: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
9730: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
9740: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
9750: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
9760: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
9770: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
9780: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
9790: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
97a0: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
97b0: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
97c0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
97d0: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
97e0: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
97f0: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
9800: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
9810: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
9820: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
9830: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
9840: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
9850: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9860: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
9870: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
9880: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
9890: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
98a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
98b0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
98c0: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
98d0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
98e0: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
98f0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
9900: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
9910: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
9920: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
9930: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
9940: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
9950: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
9960: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
9970: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
9980: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
9990: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
99a0: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
99b0: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
99c0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
99d0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
99e0: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
99f0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
9a00: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
9a10: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9a20: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
9a30: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
9a40: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
9a50: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
9a60: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
9a70: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
9a80: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
9a90: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
9aa0: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
9ab0: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
9ac0: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20  ot dirty..  **. 
9ad0: 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31   ** Ticket #1171
9ae0: 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74  :  The statement
9af0: 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
9b00: 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74  ontain page cont
9b10: 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a  ent that is.  **
9b20: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
9b30: 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  the page content
9b40: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
9b50: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
9b60: 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75  ..  ** This occu
9b70: 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69  rs when a page i
9b80: 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20  s changed prior 
9b90: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
9ba0: 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  a statement.  **
9bb0: 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67   then changed ag
9bc0: 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73  ain within the s
9bd0: 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20  tatement.  When 
9be0: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63  rolling back suc
9bf0: 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65  h a.  ** stateme
9c00: 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77  nt we must not w
9c10: 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67  rite to the orig
9c20: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e  inal database un
9c30: 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a  less we know.  *
9c40: 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68  * for certain th
9c50: 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  at original page
9c60: 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e   contents are in
9c70: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
9c80: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
9c90: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20    Otherwise, if 
9ca0: 61 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20  a full ROLLBACK 
9cb0: 6f 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65  occurs after the
9cc0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9cd0: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c  rollback the ful
9ce0: 6c 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20  l ROLLBACK will 
9cf0: 6e 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20  not restore the 
9d00: 70 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67  page to its orig
9d10: 69 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e  inal.  ** conten
9d20: 74 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f  t.  Two conditio
9d30: 6e 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62  ns must be met b
9d40: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
9d50: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
9d60: 2a 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68  ** files. (1) th
9d70: 65 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20  e database must 
9d80: 62 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  be locked.  (2) 
9d90: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
9da0: 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70   original.  ** p
9db0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69  age content is i
9dc0: 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
9dd0: 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
9de0: 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
9df0: 74 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20  t in.  ** cache 
9e00: 6f 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61  or else it is ma
9e10: 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63  rked as needSync
9e20: 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  ==0..  */.  pPg 
9e30: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
9e40: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
9e50: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
9e60: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9e70: 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30  LUSIVE || pPg!=0
9e80: 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45   );.  PAGERTRACE
9e90: 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70  3("PLAYBACK %d p
9ea0: 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
9eb0: 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f  ID(pPager), pgno
9ec0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
9ed0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
9ee0: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
9ef0: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
9f00: 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72  ync==0) ){.    r
9f10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
9f20: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
9f30: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
9f40: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9f50: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
9f60: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
9f70: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
9f80: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44  e(pPager->fd, aD
9f90: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
9fa0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9fb0: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
9fc0: 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
9fd0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
9fe0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
9ff0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
a000: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
a010: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
a020: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
a030: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
a040: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
a050: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
a060: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
a070: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
a080: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
a090: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
a0a0: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
a0b0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
a0c0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
a0d0: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
a0e0: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
a0f0: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
a100: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
a110: 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
a120: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
a130: 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20   void *pData;.  
a140: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67    /* assert( pPg
a150: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67  ->nRef==0 || pPg
a160: 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a  ->pgno==1 ); */.
a170: 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44      pData = PGHD
a180: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
a190: 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61      memcpy(pData
a1a0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
a1b0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a1c0: 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
a1d0: 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a  tructor ){  /***
a1e0: 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64   FIX ME:  Should
a1f0: 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74   this be xReinit
a200: 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61  ? ***/.      pPa
a210: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
a220: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
a230: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23  geSize);.    }.#
a240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
a250: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
a260: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
a270: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
a280: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44  ;.#endif.    COD
a290: 45 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC1(pPager, pDat
a2a0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
a2b0: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
a2c0: 73 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68  s was page 1, th
a2d0: 65 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76  en restore the v
a2e0: 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 69 43  alue of Pager.iC
a2f0: 68 61 6e 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20  hangeCount */.  
a300: 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
a310: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69  .      pPager->i
a320: 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65  ChangeCount = re
a330: 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
a340: 2c 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 24);.    }.  }
a350: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a360: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
a370: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
a380: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
a390: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
a3a0: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
a3b0: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
a3c0: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
a3d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a3e0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
a3f0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
a400: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
a410: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
a420: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
a430: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a440: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
a450: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
a460: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a470: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
a480: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
a490: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
a4a0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
a4b0: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
a4c0: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
a4d0: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
a4e0: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
a4f0: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
a500: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
a510: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
a520: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
a530: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
a540: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
a550: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
a560: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
a570: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
a580: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
a590: 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61  master(const cha
a5a0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
a5b0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
a5c0: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
a5d0: 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d  OsFile *master =
a5e0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   0;.  char *zMas
a5f0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
a600: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
a610: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a620: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
a630: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
a640: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
a650: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a660: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
a670: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a680: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
a690: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
a6a0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
a6b0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
a6c0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
a6d0: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
a6e0: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
a6f0: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72  erence..  */.  r
a700: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
a710: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
a720: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69  r, &master);.  i
a730: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a740: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a750: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
a760: 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d  open = 1;.  rc =
a770: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a780: 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73  ze(master, &nMas
a790: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
a7a0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
a7b0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
a7c0: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
a7d0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
a7e0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
a7f0: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
a800: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
a810: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
a820: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
a830: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
a840: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
a850: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
a860: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  teMalloc() and p
a870: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
a880: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
a890: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
a8a0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
a8b0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
a8c0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a8d0: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
a8e0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
a8f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
a900: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
a910: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
a920: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
a930: 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65  ite3OsRead(maste
a940: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
a950: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
a960: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
a970: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
a980: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
a990: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
a9a0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
a9b0: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
a9c0: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
a9d0: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
a9e0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
a9f0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
aa00: 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29  ists(zJournal) )
aa10: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
aa20: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
aa30: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
aa40: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
aa50: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
aa60: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
aa70: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
aa80: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
aa90: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
aaa0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
aab0: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
aac0: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
aad0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
aae0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
aaf0: 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c   OsFile *journal
ab00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
ab10: 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63  t c;..        rc
ab20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
ab30: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
ab40: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
ab50: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
ab60: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ab70: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
ab80: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
ab90: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
aba0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
abb0: 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  al(journal, &zMa
abc0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
abd0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
abe0: 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (&journal);.    
abf0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ac00: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ac10: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
ac20: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
ac30: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
ac40: 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73  asterPtr!=0 && s
ac50: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
ac60: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
ac70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
ac80: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
ac90: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
aca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
acb0: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
acc0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
acd0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
ace0: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
acf0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
ad00: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
ad10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
ad20: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
ad30: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
ad40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
ad50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
ad60: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
ad70: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
ad80: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
ad90: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
ada0: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
adb0: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
adc0: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
add0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
ade0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
adf0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
ae00: 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a 20 4d 61  ..#if 0./*.** Ma
ae10: 6b 65 20 65 76 65 72 79 20 70 61 67 65 20 69 6e  ke every page in
ae20: 20 74 68 65 20 63 61 63 68 65 20 61 67 72 65 65   the cache agree
ae30: 20 77 69 74 68 20 77 68 61 74 20 69 73 20 6f 6e   with what is on
ae40: 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72   disk.  In other
ae50: 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61   words,.** rerea
ae60: 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20 72 65  d the disk to re
ae70: 73 65 74 20 74 68 65 20 73 74 61 74 65 20 6f 66  set the state of
ae80: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
ae90: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
aea0: 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61  s called after a
aeb0: 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69   rollback in whi
aec0: 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65 20 64  ch some of the d
aed0: 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20 70 61  irty cache.** pa
aee0: 67 65 73 20 68 61 64 20 6e 65 76 65 72 20 62 65  ges had never be
aef0: 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  en written out t
af00: 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65 65 64  o disk.  We need
af10: 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
af20: 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e 74 65  e.** cache conte
af30: 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73 69 65  nt and the easie
af40: 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74 68 61  st way to do tha
af50: 74 20 69 73 20 74 6f 20 72 65 72 65 61 64 20 74  t is to reread t
af60: 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a  he old content.*
af70: 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  * back from the 
af80: 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  disk..*/.static 
af90: 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f 61 64  int pager_reload
afa0: 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70 50  _cache(Pager *pP
afb0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
afc0: 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
afd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72  SQLITE_OK;.  for
afe0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
aff0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
b000: 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
b010: 63 68 61 72 20 2a 7a 42 75 66 20 3d 20 70 50 61  char *zBuf = pPa
b020: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20  ger->pTmpSpace; 
b030: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73         /* Temp s
b040: 74 6f 72 61 67 65 20 66 6f 72 20 6f 6e 65 20 70  torage for one p
b050: 61 67 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  age */.    if( !
b060: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
b070: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
b080: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
b090: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
b0a0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ize ){.      rc 
b0b0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
b0c0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
b0d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
b0e0: 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29  4)(pPg->pgno-1))
b0f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
b100: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b110: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
b120: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
b130: 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
b140: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
b150: 20 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52     }.      PAGER
b160: 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48 20  TRACE3("REFETCH 
b170: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
b180: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
b190: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
b1a0: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
b1b0: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70  ;.      CODEC1(p
b1c0: 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67  Pager, zBuf, pPg
b1d0: 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20  ->pgno, 2);.    
b1e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
b1f0: 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61  set(zBuf, 0, pPa
b200: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
b210: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
b220: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65  g->nRef==0 || me
b230: 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52  mcmp(zBuf, PGHDR
b240: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
b250: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
b260: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
b270: 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
b280: 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65  Pg), zBuf, pPage
b290: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
b2a0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b2b0: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
b2c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
b2d0: 69 6e 69 74 65 72 28 70 50 67 2c 20 70 50 61 67  initer(pPg, pPag
b2e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
b2f0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b300: 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
b310: 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
b320: 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
b330: 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
b340: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
b350: 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
b360: 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20  .    pPg->dirty 
b370: 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 0;.#ifdef SQLI
b380: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
b390: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
b3a0: 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
b3b0: 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
b3c0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69   }.  pPager->pDi
b3d0: 72 74 79 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  rty = 0;.  retur
b3e0: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  n rc;.}.#endif..
b3f0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
b400: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
b410: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
b420: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
b430: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
b440: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
b450: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
b460: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
b470: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61   int nPage){.  a
b480: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
b490: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
b4a0: 55 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72  USIVE );.  retur
b4b0: 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63  n sqlite3OsTrunc
b4c0: 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ate(pPager->fd, 
b4d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
b4e0: 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a  *(i64)nPage);.}.
b4f0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
b500: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
b510: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
b520: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
b530: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
b540: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
b550: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
b560: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
b570: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
b580: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
b590: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
b5a0: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
b5b0: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
b5c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
b5d0: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
b5e0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
b5f0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
b600: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
b610: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
b620: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
b630: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
b640: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
b650: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
b660: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
b670: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
b680: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
b690: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
b6a0: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
b6b0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
b6c0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
b6d0: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
b6e0: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
b6f0: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
b700: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
b710: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
b720: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
b730: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
b740: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
b750: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
b760: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
b770: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
b780: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
b790: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b7a0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
b7b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
b7c0: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
b7d0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
b7e0: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
b7f0: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
b800: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
b810: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
b820: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
b830: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
b840: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
b850: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
b860: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
b870: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
b880: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
b890: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
b8a0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
b8b0: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
b8c0: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
b8d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
b8e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
b8f0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
b900: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
b910: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
b920: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
b930: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
b940: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
b950: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
b960: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
b970: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
b980: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
b990: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
b9a0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
b9b0: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
b9c0: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
b9d0: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
b9e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
b9f0: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
ba00: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
ba10: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
ba20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
ba30: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
ba40: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
ba50: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
ba60: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
ba70: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
ba80: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
ba90: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
baa0: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
bab0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
bac0: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
bad0: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
bae0: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
baf0: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
bb00: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
bb10: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
bb20: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
bb30: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
bb40: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
bb50: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
bb60: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
bb70: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
bb80: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
bb90: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
bba0: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
bbb0: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
bbc0: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
bbd0: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
bbe0: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
bbf0: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
bc00: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
bc10: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
bc20: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
bc30: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
bc40: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
bc50: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
bc60: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
bc70: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
bc80: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
bc90: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
bca0: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
bcb0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
bcc0: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
bcd0: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
bce0: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
bcf0: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
bd00: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
bd10: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
bd20: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
bd30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
bd40: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
bd50: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
bd60: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
bd70: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
bd80: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
bd90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
bda0: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
bdb0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
bdc0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
bdd0: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
bde0: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
bdf0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
be00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
be10: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
be20: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
be30: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
be40: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
be50: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
be60: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
be70: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
be80: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
be90: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
bea0: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
beb0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
bec0: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
bed0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
bee0: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
bef0: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
bf00: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
bf10: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
bf20: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
bf30: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
bf40: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
bf50: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
bf60: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
bf70: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
bf80: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
bf90: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
bfa0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
bfb0: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 69 36  int isHot){.  i6
bfc0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
bfd0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
bfe0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bff0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
c000: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
c010: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c020: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
c030: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
c040: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
c060: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
c070: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
c080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
c090: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
c0a0: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
c0b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
c0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c0d0: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
c0e0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
c0f0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
c100: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
c110: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
c120: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
c130: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
c140: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
c150: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
c160: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
c170: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
c180: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
c190: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
c1a0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
c1b0: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
c1c0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
c1d0: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
c1e0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
c1f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
c200: 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
c210: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
c220: 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
c230: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c240: 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
c250: 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
c260: 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
c270: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
c280: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
c290: 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
c2a0: 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
c2b0: 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
c2c0: 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
c2d0: 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
c2e0: 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
c2f0: 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
c300: 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
c310: 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74  .  rc = readMast
c320: 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
c330: 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72 29  ->jfd, &zMaster)
c340: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
c350: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
c360: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c370: 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26  OK || (zMaster &
c380: 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  & !sqlite3OsFile
c390: 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29 29  Exists(zMaster))
c3a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
c3b0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(zMaster);.   
c3c0: 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
c3d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c3e0: 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51 4c  _DONE ) rc = SQL
c3f0: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f  ITE_OK;.    goto
c400: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
c410: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65   }.  sqlite3OsSe
c420: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
c430: 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  0);.  pPager->jo
c440: 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20  urnalOff = 0;.. 
c450: 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65   /* This loop te
c460: 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72 20  rminates either 
c470: 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75  when the readJou
c480: 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72  rnalHdr() call r
c490: 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49  eturns.  ** SQLI
c4a0: 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f  TE_DONE or an IO
c4b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
c4c0: 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  /.  while( 1 ){.
c4d0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
c4e0: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
c4f0: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
c500: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20  urnal file.  If 
c510: 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a  there are.    **
c520: 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65   not enough byte
c530: 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f  s left in the jo
c540: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61  urnal file for a
c550: 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72   complete header
c560: 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69  , or.    ** it i
c570: 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65  s corrupted, the
c580: 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74  n a process must
c590: 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65   of failed while
c5a0: 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20   writing it..   
c5b0: 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74   ** This indicat
c5c0: 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20  es nothing more 
c5d0: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
c5e0: 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a  ed back..    */.
c5f0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
c600: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
c610: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50  szJ, &nRec, &mxP
c620: 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
c630: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20  SQLITE_OK ){ .  
c640: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c650: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
c660: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c670: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  K;.      }.     
c680: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c690: 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ck;.    }..    /
c6a0: 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78 66  * If nRec is 0xf
c6b0: 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68  fffffff, then th
c6c0: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63  is journal was c
c6d0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
c6e0: 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69  ess.    ** worki
c6f0: 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  ng in no-sync mo
c700: 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74  de. This means t
c710: 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66 20  hat the rest of 
c720: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
c730: 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73  ** file consists
c740: 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72 65   of pages, there
c750: 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75   are no more jou
c760: 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f  rnal headers. Co
c770: 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65  mpute.    ** the
c780: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62   value of nRec b
c790: 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73  ased on this ass
c7a0: 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  umption..    */.
c7b0: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78      if( nRec==0x
c7c0: 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20  ffffffff ){.    
c7d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c7e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
c7f0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
c800: 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52  ger) );.      nR
c810: 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52  ec = (szJ - JOUR
c820: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
c830: 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  r))/JOURNAL_PG_S
c840: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  Z(pPager);.    }
c850: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
c860: 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
c870: 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
c880: 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
c890: 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
c8a0: 2a 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20 74  ** process. In t
c8b0: 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65 73  his case the res
c8c0: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
c8d0: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
c8e0: 66 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  f.    ** journal
c8f0: 6c 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70 61  led copies of pa
c900: 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ges that need to
c910: 20 62 65 20 72 65 61 64 20 62 61 63 6b 20 69 6e   be read back in
c920: 74 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20 20  to the cache..  
c930: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
c940: 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 29  c==0 && !isHot )
c950: 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
c960: 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
c970: 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
c980: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
c990: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c9a0: 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
c9b0: 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
c9c0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
c9d0: 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
c9e0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
c9f0: 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
ca00: 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  's original size
ca10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ca20: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ca30: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
ca40: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
ca50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
ca60: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ca70: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
ca80: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ca90: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
caa0: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
cab0: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
cac0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
cad0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
cae0: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
caf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cb00: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
cb10: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
cb20: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
cb30: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
cb40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
cb50: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
cb60: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
cb70: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
cb80: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
cb90: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
cba0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
cbb0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
cbc0: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
cbd0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
cbe0: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
cbf0: 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   1);.      if( r
cc00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cc10: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
cc20: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
cc30: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
cc40: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
cc50: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cc60: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20  alOff = szJ;.   
cc70: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
cc80: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
cc90: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
cca0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
ccb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ccc0: 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
ccd0: 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
cce0: 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
ccf0: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
cd00: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd10: 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
cd20: 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
cd30: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
cd40: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
cd50: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
cd60: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
cd70: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
cd80: 69 6c 6c 20 72 65 74 75 72 6e 20 73 75 63 63 65  ill return succe
cd90: 73 73 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ss,.    ** see i
cda0: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
cdb0: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
cdc0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
cdd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
cde0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
cdf0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
ce00: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
ce10: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
ce20: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
ce30: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
ce40: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
ce50: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
ce60: 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
ce70: 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
ce80: 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
ce90: 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
cea0: 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
ceb0: 69 66 66 65 72 65 6e 74 20 73 65 63 74 6f 72 20  ifferent sector 
cec0: 73 69 7a 65 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  size.  ** value.
ced0: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
cee0: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
cef0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
cf00: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
cf10: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
cf20: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
cf30: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
cf40: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
cf50: 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
cf60: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
cf70: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  al..**.** This i
cf80: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c 61  s similar to pla
cf90: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74 72  ying back the tr
cfa0: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
cfb0: 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61 20  l but with.** a 
cfc0: 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74 73  few extra twists
cfd0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  ..**.**    (1)  
cfe0: 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  The number of pa
cff0: 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  ges in the datab
d000: 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
d010: 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20 20  start of.**     
d020: 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65 6e      the statemen
d030: 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  t is stored in p
d040: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 2c  Pager->stmtSize,
d050: 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20 20   not in the.**  
d060: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66         journal f
d070: 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a  ile itself..**.*
d080: 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64 64  *    (2)  In add
d090: 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e 67  ition to playing
d0a0: 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d   back the statem
d0b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73  ent journal, als
d0c0: 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c 61  o.**         pla
d0d0: 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73 20  yback all pages 
d0e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
d0f0: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69 6e  on journal begin
d100: 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ning.**         
d110: 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  at offset pPager
d120: 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a  ->stmtJSize..*/.
d130: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
d140: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 50  _stmt_playback(P
d150: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
d160: 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20   i64 szJ;       
d170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
d180: 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a 6f  e of the full jo
d190: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 68  urnal */.  i64 h
d1a0: 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52 65  drOff;.  int nRe
d1b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d1c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52    /* Number of R
d1d0: 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20  ecords */.  int 
d1e0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
d1f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
d200: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
d210: 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  ;..  szJ = pPage
d220: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23  r->journalOff;.#
d230: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a 20  ifndef NDEBUG . 
d240: 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73 7a   {.    i64 os_sz
d250: 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  J;.    rc = sqli
d260: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
d270: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73  ager->jfd, &os_s
d280: 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  zJ);.    if( rc!
d290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
d2a0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73 73 65  urn rc;.    asse
d2b0: 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20  rt( szJ==os_szJ 
d2c0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
d2d0: 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66 20 74   /* Set hdrOff t
d2e0: 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65 74 20  o be the offset 
d2f0: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 65  just after the e
d300: 6e 64 20 6f 66 20 74 68 65 20 6c 61 73 74 20 6a  nd of the last j
d310: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65  ournal.  ** page
d320: 20 77 72 69 74 74 65 6e 20 62 65 66 6f 72 65 20   written before 
d330: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
d340: 6c 2d 68 65 61 64 65 72 20 66 6f 72 20 74 68 69  l-header for thi
d350: 73 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  s statement.  **
d360: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
d370: 20 77 72 69 74 74 65 6e 2c 20 6f 72 20 74 68 65   written, or the
d380: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
d390: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
d3a0: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
d3b0: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
d3c0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
d3d0: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
d3e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
d3f0: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
d400: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
d410: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
d420: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20   = szJ;.  }.  . 
d430: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
d440: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
d450: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
d460: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ize..  */.  if( 
d470: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
d480: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
d490: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
d4a0: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
d4b0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
d4c0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  ze);.  }.  asser
d4d0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
d4e0: 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
d4f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
d500: 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
d510: 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67  tSize;..  /* Fig
d520: 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
d530: 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
d540: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
d550: 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73  urnal..  */.  as
d560: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
d570: 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65  mtInUse && pPage
d580: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
d590: 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65  ;.  sqlite3OsSee
d5a0: 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  k(pPager->stfd, 
d5b0: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
d5c0: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
d5d0: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
d5e0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
d5f0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
d600: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
d610: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
d620: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
d630: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
d640: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
d650: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
d660: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
d670: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
d680: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
d690: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
d6a0: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
d6b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
d6c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
d6d0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
d6e0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
d6f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
d700: 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  (pPager, pPager-
d710: 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61  >stfd, 0);.    a
d720: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
d730: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66  E_DONE );.    if
d740: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d750: 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f  ) goto end_stmt_
d760: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
d770: 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d   /* Now roll som
d780: 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f  e pages back fro
d790: 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  m the transactio
d7a0: 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72  n journal. Pager
d7b0: 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20  .stmtJSize.  ** 
d7c0: 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20  was the size of 
d7d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
d7e0: 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74 65   when this state
d7f0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
d800: 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74  , so.  ** everyt
d810: 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74 20  hing after that 
d820: 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c  needs to be roll
d830: 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20  ed back, either 
d840: 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  into the.  ** da
d850: 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f  tabase, the memo
d860: 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74  ry cache, or bot
d870: 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  h..  **.  ** If 
d880: 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20  it is not zero, 
d890: 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48  then Pager.stmtH
d8a0: 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66  drOff is the off
d8b0: 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72 74  set to the start
d8c0: 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72  .  ** of the fir
d8d0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
d8e0: 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67  r written during
d8f0: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
d900: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
d910: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
d920: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
d930: 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  fd, pPager->stmt
d940: 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
d950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
d960: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
d970: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20  _playback;.  }. 
d980: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d990: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
d9a0: 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  mtJSize;.  pPage
d9b0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70  r->cksumInit = p
d9c0: 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
d9d0: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
d9e0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20  r->journalOff < 
d9f0: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72 63  hdrOff ){.    rc
da00: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
da10: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
da20: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
da30: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
da40: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
da50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
da60: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
da70: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
da80: 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  k;.  }..  while(
da90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
daa0: 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20  Off < szJ ){.   
dab0: 20 75 33 32 20 6e 4a 52 65 63 3b 20 20 20 20 20   u32 nJRec;     
dac0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
dad0: 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
dae0: 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
daf0: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
db00: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
db10: 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
db20: 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28  &dummy);.    if(
db30: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
db40: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
db50: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
db60: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
db70: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
db80: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
db90: 4a 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  JRec==0 ){.     
dba0: 20 6e 4a 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20   nJRec = (szJ - 
dbb0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
dbc0: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
dbd0: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
dbe0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65  }.    for(i=nJRe
dbf0: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
dc00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
dc10: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
dc20: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
dc30: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
dc40: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
dc50: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
dc60: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
dc70: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
dc80: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
dc90: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
dca0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
dcb0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
dcc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
dcd0: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
dce0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
dcf0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
dd00: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
dd10: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
dd20: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
dd30: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
dd40: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
dd50: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
dd60: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
dd70: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
dd80: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
dd90: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
dda0: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
ddb0: 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
ddc0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
ddd0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
dde0: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
ddf0: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
de00: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
de10: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
de20: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
de30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
de40: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
de50: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
de60: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
de70: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
de80: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
de90: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
dea0: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
deb0: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
dec0: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
ded0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
dee0: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
def0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
df00: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
df10: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
df20: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
df30: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
df40: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
df50: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
df60: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
df70: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
df80: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
df90: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
dfa0: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
dfb0: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
dfc0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
dfd0: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
dfe0: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
dff0: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
e000: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
e010: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
e020: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
e030: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
e040: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
e050: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
e060: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
e070: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
e080: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
e090: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
e0a0: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
e0b0: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
e0c0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
e0e0: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
e0f0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
e100: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
e110: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
e120: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
e130: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
e140: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
e150: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
e160: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
e170: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
e180: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
e190: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
e1a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
e1b0: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
e1c0: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
e1d0: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
e1e0: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
e1f0: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
e200: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
e210: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
e220: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
e230: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
e240: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
e250: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
e260: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
e270: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
e280: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
e290: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
e2a0: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
e2b0: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
e2c0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
e2d0: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
e2e0: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
e2f0: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
e300: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
e310: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
e320: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
e330: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
e340: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
e350: 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
e360: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
e370: 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
e380: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
e390: 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
e3a0: 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
e3b0: 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
e3c0: 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
e3d0: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
e3e0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
e3f0: 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
e400: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
e410: 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e  Pager->full_fsyn
e420: 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 0a  c = full_fsync;.
e430: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
e440: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
e450: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
e460: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
e470: 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
e480: 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
e490: 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
e4a0: 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
e4b0: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
e4c0: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
e4d0: 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
e4e0: 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
e4f0: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
e500: 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
e510: 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
e520: 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
e530: 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
e540: 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
e550: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
e560: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a  mporary file. .*
e570: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66  *.** Write the f
e580: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
e590: 6e 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e  nto *fd.  Return
e5a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
e5b0: 63 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a  ccess or some.**
e5c0: 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64   other error cod
e5d0: 65 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a  e if we fail..**
e5e0: 0a 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  .** The OS will 
e5f0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
e600: 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
e610: 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
e620: 69 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f  is.** closed..*/
e630: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
e640: 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
e650: 28 4f 73 46 69 6c 65 20 2a 2a 70 46 64 29 7b 0a  (OsFile **pFd){.
e660: 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20    int cnt = 8;. 
e670: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
e680: 7a 46 69 6c 65 5b 53 51 4c 49 54 45 5f 54 45 4d  zFile[SQLITE_TEM
e690: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 23 69  PNAME_SIZE];..#i
e6a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
e6b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  .  sqlite3_opent
e6c0: 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f 2a  emp_count++;  /*
e6d0: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
e6e0: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
e6f0: 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  nly */.#endif.  
e700: 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20  do{.    cnt--;. 
e710: 20 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70     sqlite3OsTemp
e720: 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b  FileName(zFile);
e730: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e740: 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
e750: 28 7a 46 69 6c 65 2c 20 70 46 64 2c 20 31 29 3b  (zFile, pFd, 1);
e760: 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30  .  }while( cnt>0
e770: 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   && rc!=SQLITE_O
e780: 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
e790: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72  NOMEM );.  retur
e7a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
e7b0: 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
e7c0: 20 63 61 63 68 65 20 61 6e 64 20 70 75 74 20 61   cache and put a
e7d0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
e7e0: 70 61 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70  page cache in *p
e7f0: 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66  pPager..** The f
e800: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
e810: 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e   need not exist.
e820: 20 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f    The file is no
e830: 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a  t locked until.*
e840: 2a 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  * the first call
e850: 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
e860: 47 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c  Get() and is onl
e870: 79 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69  y held open unti
e880: 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61  l the.** last pa
e890: 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75  ge is released u
e8a0: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
e8b0: 72 55 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  rUnref()..**.** 
e8c0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
e8d0: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
e8e0: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
e8f0: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
e900: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
e910: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
e920: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
e930: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
e940: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
e950: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
e960: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
e970: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
e980: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
e990: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
e9a0: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
e9b0: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
e9c0: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
e9d0: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
e9e0: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
e9f0: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
ea00: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
ea10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
ea20: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
ea30: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
ea40: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
ea50: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
ea60: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
ea70: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
ea80: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
ea90: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
eaa0: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
eab0: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
eac0: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
ead0: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
eae0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
eaf0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eb10: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
eb20: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
eb30: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
eb40: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
eb50: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30  FullPathname = 0
eb60: 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b  ;.  int nameLen;
eb70: 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 20 69 73    /* Compiler is
eb80: 20 77 72 6f 6e 67 2e 20 54 68 69 73 20 69 73 20   wrong. This is 
eb90: 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
eba0: 65 64 20 62 65 66 6f 72 65 20 75 73 65 20 2a 2f  ed before use */
ebb0: 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 20 3d 20  .  OsFile *fd = 
ebc0: 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
ebd0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69  LITE_OK;.  int i
ebe0: 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65  ;.  int tempFile
ebf0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44   = 0;.  int memD
ec00: 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61  b = 0;.  int rea
ec10: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69 6e 74  dOnly = 0;.  int
ec20: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 28 66   useJournal = (f
ec30: 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f 4d 49  lags & PAGER_OMI
ec40: 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b 0a 20  T_JOURNAL)==0;. 
ec50: 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b 20   int noReadlock 
ec60: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
ec70: 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d 30  _NO_READLOCK)!=0
ec80: 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53  ;.  char zTemp[S
ec90: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
eca0: 49 5a 45 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  IZE];.#ifdef SQL
ecb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
ecc0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f  Y_MANAGEMENT.  /
ecd0: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e  * A malloc() can
ece0: 6e 6f 74 20 66 61 69 6c 20 69 6e 20 73 71 6c 69  not fail in sqli
ecf0: 74 65 33 54 68 72 65 61 64 44 61 74 61 28 29 20  te3ThreadData() 
ed00: 61 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63  as one or more c
ed10: 61 6c 6c 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61  alls to .  ** ma
ed20: 6c 6c 6f 63 28 29 20 6d 75 73 74 20 68 61 76 65  lloc() must have
ed30: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6d 61   already been ma
ed40: 64 65 20 62 79 20 74 68 69 73 20 74 68 72 65 61  de by this threa
ed50: 64 20 62 65 66 6f 72 65 20 69 74 20 67 65 74 73  d before it gets
ed60: 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f  .  ** to this po
ed70: 69 6e 74 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  int. This means 
ed80: 74 68 65 20 54 68 72 65 61 64 44 61 74 61 20 6d  the ThreadData m
ed90: 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 61 6c  ust have been al
eda0: 6c 6f 63 61 74 65 64 20 61 6c 72 65 61 64 79 0a  located already.
edb0: 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 54 68 72    ** so that Thr
edc0: 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63  eadData.nAlloc c
edd0: 61 6e 20 62 65 20 73 65 74 2e 20 49 74 20 77 6f  an be set. It wo
ede0: 75 6c 64 20 62 65 20 6e 69 63 65 20 74 6f 20 61  uld be nice to a
edf0: 73 73 65 72 74 0a 20 20 2a 2a 20 74 68 61 74 20  ssert.  ** that 
ee00: 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c 6f  ThreadData.nAllo
ee10: 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 62  c is non-zero, b
ee20: 75 74 20 61 6c 61 73 20 74 68 69 73 20 62 72 65  ut alas this bre
ee30: 61 6b 73 20 74 65 73 74 20 63 61 73 65 73 20 0a  aks test cases .
ee40: 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
ee50: 69 6e 76 6f 6b 65 20 74 68 65 20 70 61 67 65 72  invoke the pager
ee60: 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 2a 2f 0a   directly..  */.
ee70: 20 20 54 68 72 65 61 64 44 61 74 61 20 2a 70 54    ThreadData *pT
ee80: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 68 72 65  sd = sqlite3Thre
ee90: 61 64 44 61 74 61 28 29 3b 0a 20 20 61 73 73 65  adData();.  asse
eea0: 72 74 28 20 70 54 73 64 20 29 3b 0a 23 65 6e 64  rt( pTsd );.#end
eeb0: 69 66 0a 0a 20 20 2f 2a 20 57 65 20 75 73 65 64  if..  /* We used
eec0: 20 74 6f 20 74 65 73 74 20 69 66 20 6d 61 6c 6c   to test if mall
eed0: 6f 63 28 29 20 68 61 64 20 61 6c 72 65 61 64 79  oc() had already
eee0: 20 66 61 69 6c 65 64 20 62 65 66 6f 72 65 20 70   failed before p
eef0: 72 6f 63 65 65 64 69 6e 67 2e 20 0a 20 20 2a 2a  roceeding. .  **
ef00: 20 42 75 74 20 74 68 65 20 77 61 79 20 74 68 69   But the way thi
ef10: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
ef20: 65 64 20 69 6e 20 53 51 4c 69 74 65 20 6d 65 61  ed in SQLite mea
ef30: 6e 73 20 74 68 61 74 20 63 61 6e 20 6e 65 76 65  ns that can neve
ef40: 72 0a 20 20 2a 2a 20 68 61 70 70 65 6e 2e 20 46  r.  ** happen. F
ef50: 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 74  urthermore, if t
ef60: 68 65 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64  he malloc-failed
ef70: 20 66 6c 61 67 20 69 73 20 61 6c 72 65 61 64 79   flag is already
ef80: 20 73 65 74 2c 20 0a 20 20 2a 2a 20 65 69 74 68   set, .  ** eith
ef90: 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  er the call to s
efa0: 71 6c 69 74 65 53 74 72 44 75 70 28 29 20 6f 72  qliteStrDup() or
efb0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
efc0: 62 65 6c 6f 77 20 77 69 6c 6c 0a 20 20 2a 2a 20  below will.  ** 
efd0: 66 61 69 6c 20 73 68 6f 72 74 6c 79 20 61 6e 64  fail shortly and
efe0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 72 65   SQLITE_NOMEM re
eff0: 74 75 72 6e 65 64 20 61 6e 79 77 61 79 2e 0a 20  turned anyway.. 
f000: 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
f010: 20 30 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   0;..  /* Open t
f020: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 61 6e  he pager file an
f030: 64 20 73 65 74 20 7a 46 75 6c 6c 50 61 74 68 6e  d set zFullPathn
f040: 61 6d 65 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  ame to point at 
f050: 6d 61 6c 6c 6f 63 28 29 65 64 20 0a 20 20 2a 2a  malloc()ed .  **
f060: 20 6d 65 6d 6f 72 79 20 63 6f 6e 74 61 69 6e 69   memory containi
f070: 6e 67 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ng the complete 
f080: 66 69 6c 65 6e 61 6d 65 20 28 69 2e 65 2e 20 69  filename (i.e. i
f090: 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 64 69 72  ncluding the dir
f0a0: 65 63 74 6f 72 79 29 2e 0a 20 20 2a 2f 0a 20 20  ectory)..  */.  
f0b0: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26  if( zFilename &&
f0c0: 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
f0d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f0e0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
f0f0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
f100: 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
f110: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
f120: 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
f130: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
f140: 73 71 6c 69 74 65 53 74 72 44 75 70 28 22 22 29  sqliteStrDup("")
f150: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
f160: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
f170: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
f180: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
f190: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
f1a0: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
f1b0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
f1c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f1d0: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
f1e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
f1f0: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
f200: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
f210: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
f220: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
f230: 74 65 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73  temp(&fd);.    s
f240: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
f250: 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Name(zTemp);.   
f260: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65   zFilename = zTe
f270: 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74  mp;.    zFullPat
f280: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
f290: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
f2a0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
f2b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f2c0: 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c  ){.      tempFil
f2d0: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
f2e0: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
f2f0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
f300: 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20  ure. As part of 
f310: 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74  the same allocat
f320: 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ion, allocate.  
f330: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
f340: 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74   full paths of t
f350: 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f  he file, directo
f360: 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a  ry and journal .
f370: 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c    ** (Pager.zFil
f380: 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69  ename, Pager.zDi
f390: 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65  rectory and Page
f3a0: 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a  r.zJournal)..  *
f3b0: 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74  /.  if( zFullPat
f3c0: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d  hname ){.    nam
f3d0: 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46  eLen = strlen(zF
f3e0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
f3f0: 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
f400: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
f410: 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c  *pPager) + nameL
f420: 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20  en*3 + 30 );.   
f430: 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72   if( pPager && r
f440: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f450: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
f460: 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20  mpSpace = (char 
f470: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  *)sqliteMallocRa
f480: 77 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  w(SQLITE_DEFAULT
f490: 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
f4a0: 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
f4b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
f4c0: 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
f4d0: 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
f4e0: 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79   free the memory
f4f0: 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74   .  ** pointed t
f500: 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61  o by zFullPathna
f510: 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50 61 67  me, free the Pag
f520: 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
f530: 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a   close the .  **
f540: 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65   file. Since the
f550: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c   pager is not al
f560: 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73  located there is
f570: 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20   no need to set 
f580: 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e  .  ** any Pager.
f590: 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65  errMask variable
f5a0: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  s..  */.  if( !p
f5b0: 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50  Pager || !zFullP
f5c0: 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67  athname || !pPag
f5d0: 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c  er->pTmpSpace ||
f5e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f5f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
f600: 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
f610: 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
f620: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  athname);.    sq
f630: 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
f640: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
f650: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
f660: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
f670: 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
f680: 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
f690: 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
f6a0: 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  fd), zFullPathna
f6b0: 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  me);.  IOTRACE((
f6c0: 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
f6d0: 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74  pPager, zFullPat
f6e0: 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72  hname)).  pPager
f6f0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
f700: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
f710: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
f720: 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
f730: 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
f740: 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
f750: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
f760: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
f770: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
f780: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
f790: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
f7a0: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
f7b0: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
f7c0: 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
f7d0: 6d 65 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 6e 61  me);..  for(i=na
f7e0: 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50  meLen; i>0 && pP
f7f0: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
f800: 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29  [i-1]!='/'; i--)
f810: 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70  {}.  if( i>0 ) p
f820: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
f830: 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74  y[i-1] = 0;.  st
f840: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  rcpy(pPager->zJo
f850: 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68  urnal, zFullPath
f860: 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46  name);.  sqliteF
f870: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
f880: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50  e);.  strcpy(&pP
f890: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
f8a0: 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e  ameLen], "-journ
f8b0: 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  al");.  pPager->
f8c0: 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70 50  fd = fd;.  /* pP
f8d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
f8e0: 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  n = 0; */.  pPag
f8f0: 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  er->useJournal =
f900: 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21   useJournal && !
f910: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
f920: 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f  >noReadlock = no
f930: 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64  Readlock && read
f940: 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65  Only;.  /* pPage
f950: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
f960: 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
f970: 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20  >stmtInUse = 0; 
f980: 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
f990: 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  nRef = 0; */.  p
f9a0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
f9b0: 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65  memDb-1;.  pPage
f9c0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53 51  r->pageSize = SQ
f9d0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
f9e0: 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50 61  E_SIZE;.  /* pPa
f9f0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
fa00: 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
fa10: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
fa20: 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
fa30: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
fa40: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 4d 61    /* pPager->nMa
fa50: 78 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  xPage = 0; */.  
fa60: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
fa70: 20 31 30 30 3b 0a 20 20 61 73 73 65 72 74 28 20   100;.  assert( 
fa80: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20  PAGER_UNLOCK==0 
fa90: 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
faa0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
fab0: 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50  LOCK; */.  /* pP
fac0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20  ager->errMask = 
fad0: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
fae0: 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46  tempFile = tempF
faf0: 69 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74  ile;.  assert( t
fb00: 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
fb10: 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
fb20: 4c 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  L .          || 
fb30: 74 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f  tempFile==PAGER_
fb40: 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
fb50: 55 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72  USIVE );.  asser
fb60: 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
fb70: 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d  MODE_EXCLUSIVE==
fb80: 31 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65  1 );.  pPager->e
fb90: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 74  xclusiveMode = t
fba0: 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70 50 61 67  empFile; .  pPag
fbb0: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
fbc0: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
fbd0: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
fbe0: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e  ;.  /* pPager->n
fbf0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a  eedSync = 0; */.
fc00: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
fc10: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
fc20: 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
fc30: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  al;.  pPager->fu
fc40: 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  llSync = (pPager
fc50: 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20  ->noSync?0:1);. 
fc60: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
fc70: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
fc80: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
fc90: 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
fca0: 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
fcb0: 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
fcc0: 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
fcd0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
fce0: 61 29 3b 0a 20 20 61 73 73 65 72 74 28 66 64 7c  a);.  assert(fd|
fcf0: 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66 28 20 21  |memDb);.  if( !
fd00: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
fd10: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
fd20: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
fd30: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 7d 0a 20  rSize(fd);.  }. 
fd40: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 42 75 73   /* pPager->pBus
fd50: 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 20 2a 2f  yHandler = 0; */
fd60: 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61  .  /* memset(pPa
fd70: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
fd80: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
fd90: 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50  ash)); */.  *ppP
fda0: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
fdb0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fdc0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
fdd0: 45 4d 45 4e 54 0a 20 20 70 50 61 67 65 72 2d 3e  EMENT.  pPager->
fde0: 70 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50  pNext = pTsd->pP
fdf0: 61 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50  ager;.  pTsd->pP
fe00: 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23  ager = pPager;.#
fe10: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
fe20: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
fe30: 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
fe40: 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
fe50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
fe60: 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
fe70: 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
fe80: 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
fe90: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
fea0: 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
feb0: 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
fec0: 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
fed0: 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
fee0: 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
fef0: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
ff00: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
ff10: 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
ff20: 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
ff30: 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
ff40: 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
ff50: 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
ff60: 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
ff70: 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
ff80: 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
ff90: 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
ffa0: 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
ffb0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
ffc0: 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
ffd0: 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
ffe0: 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  lt sqlite3PagerC
fff0: 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
10000 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
10010 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
10020 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
10030 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
10040 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
10050 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
10060 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
10070 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
10080 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
10090 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
100a0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
100b0 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
100c0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
100d0 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
100e0 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
100f0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
10100 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
10110 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
10120 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
10130 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
10140 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
10150 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
10160 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
10170 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
10180 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
10190 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
101a0 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
101b0 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
101c0 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
101d0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
101e0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
101f0 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
10200 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
10210 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
10220 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
10230 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
10240 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
10250 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
10260 69 7a 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ize.  Return the
10270 20 6e 65 77 20 73 69 7a 65 2e 20 20 49 66 20 74   new size.  If t
10280 68 65 20 73 75 67 67 65 73 74 20 6e 65 77 20 70  he suggest new p
10290 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69 73 20 69  age.** size is i
102a0 6e 61 70 70 72 6f 70 72 69 61 74 65 2c 20 74 68  nappropriate, th
102b0 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  en an alternativ
102c0 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73  e page size is s
102d0 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e 64 20 72  elected.** and r
102e0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
102f0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
10300 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
10310 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53  Pager, int pageS
10320 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
10330 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
10340 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
10350 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
10360 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
10370 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50 61 67 65  ->memDb && pPage
10380 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
10390 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
103a0 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
103b0 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
103c0 67 65 53 69 7a 65 3b 0a 20 20 20 20 70 50 61 67  geSize;.    pPag
103d0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  er->pTmpSpace = 
103e0 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72  sqlite3ReallocOr
103f0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  Free(pPager->pTm
10400 70 53 70 61 63 65 2c 20 70 61 67 65 53 69 7a 65  pSpace, pageSize
10410 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10420 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
10440 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
10450 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
10460 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
10470 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
10480 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
10490 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
104a0 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
104b0 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
104c0 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
104d0 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
104e0 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
104f0 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
10500 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
10510 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
10520 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
10530 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
10540 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
10550 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
10560 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
10570 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
10580 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
10590 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
105a0 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
105b0 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
105c0 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f  cnt;.void clear_
105d0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
105e0 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  or(){.  sqlite3_
105f0 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30  io_error_hit = 0
10600 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  ;.}.void disable
10610 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
10620 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
10630 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
10640 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
10650 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
10660 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
10670 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
10680 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10690 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
106a0 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
106b0 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
106c0 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
106d0 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d  define clear_sim
106e0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
106f0 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  ).# define disab
10700 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10710 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
10720 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
10730 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
10740 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
10750 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
10760 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
10770 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
10780 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
10790 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
107a0 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
107b0 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
107c0 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
107d0 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
107e0 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
107f0 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
10800 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
10810 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
10820 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
10830 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
10840 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
10850 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
10860 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
10870 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
10880 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
10890 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
108a0 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
108b0 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
108c0 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
108d0 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
108e0 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
108f0 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
10900 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
10910 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
10920 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
10930 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
10940 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
10950 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
10960 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
10970 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10980 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
10990 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
109a0 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
109b0 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
109c0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
109d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
109e0 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
109f0 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  0);.    enable_s
10a00 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
10a10 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  rs();.    IOTRAC
10a20 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
10a30 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
10a40 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
10a50 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
10a60 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a  >fd, pDest, N);.
10a70 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10a80 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
10a90 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
10aa0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10ab0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10ac0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
10ad0 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
10ae0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
10af0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
10b00 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
10b10 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
10b20 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
10b30 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
10b40 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
10b50 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
10b60 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
10b70 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
10b80 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
10b90 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
10ba0 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
10bb0 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
10bc0 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
10bd0 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
10be0 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
10bf0 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
10c00 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
10c10 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
10c20 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
10c30 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
10c40 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
10c50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
10c60 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10c70 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
10c80 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10c90 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
10ca0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
10cb0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
10cc0 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
10cd0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
10ce0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
10cf0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ( (rc = sqlite3O
10d00 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
10d10 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
10d20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
10d30 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
10d40 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
10d50 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
10d60 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
10d70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10d80 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
10d90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10da0 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
10db0 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
10dc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10dd0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
10de0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
10df0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
10e00 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
10e10 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
10e20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10e30 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
10e40 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
10e50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
10e60 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
10e70 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
10e80 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
10e90 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
10ea0 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
10eb0 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
10ec0 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
10ed0 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
10ee0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
10ef0 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
10f00 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
10f10 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
10f20 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
10f30 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
10f40 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
10f50 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
10f60 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
10f70 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
10f80 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
10f90 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
10fa0 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
10fb0 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
10fc0 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
10fd0 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
10fe0 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
10ff0 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
11000 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
11010 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
11020 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
11030 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
11040 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
11050 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
11060 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
11070 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
11080 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
11090 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
110a0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
110b0 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
110c0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
110d0 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
110e0 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
110f0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
11100 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
11110 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
11120 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
11130 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
11140 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
11150 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
11160 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
11170 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
11180 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
11190 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
111a0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
111b0 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
111c0 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
111d0 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
111e0 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
111f0 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
11200 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
11210 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
11220 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
11230 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
11240 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
11250 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
11260 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
11270 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
11280 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
11290 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
112a0 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
112b0 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
112c0 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
112d0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
112e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
112f0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
11300 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
11310 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
11320 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
11330 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
11340 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
11350 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
11360 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
11370 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
11380 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
11390 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
113a0 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
113b0 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
113c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
113d0 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
113e0 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
113f0 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
11400 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
11410 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
11420 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11430 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
11440 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
11450 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
11460 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
11470 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
11480 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
11490 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
114a0 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
114b0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
114c0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
114d0 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
114e0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
114f0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
11500 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
11510 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
11520 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
11530 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11540 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
11550 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
11560 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11570 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11580 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
11590 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
115a0 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
115b0 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
115c0 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
115d0 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
115e0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
115f0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
11600 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
11610 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
11620 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
11630 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
11640 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
11650 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
11660 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
11670 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11680 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
11690 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
116a0 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
116b0 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
116c0 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
116d0 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
116e0 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
116f0 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
11700 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
11710 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
11720 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
11730 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
11740 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
11750 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
11760 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11770 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
11780 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
11790 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
117a0 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
117b0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
117c0 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
117d0 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
117e0 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
117f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
11800 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
11810 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
11820 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
11830 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
11840 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
11850 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
11860 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
11870 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
11880 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
11890 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
118a0 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
118b0 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
118c0 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
118d0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
118e0 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
118f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
11900 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
11910 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
11920 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  e memoryTruncate
11930 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (p).#endif../*.*
11940 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
11950 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
11960 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
11970 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
11980 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
11990 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
119a0 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
119b0 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
119c0 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
119d0 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
119e0 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
119f0 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
11a00 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
11a10 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
11a20 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
11a30 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
11a40 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
11a50 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
11a60 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
11a70 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
11a80 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
11a90 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
11aa0 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
11ab0 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
11ac0 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
11ad0 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
11ae0 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
11af0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
11b00 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
11b10 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
11b20 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
11b30 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
11b40 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
11b50 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
11b60 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
11b70 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
11b80 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
11b90 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
11ba0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11bb0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11bc0 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
11bd0 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
11be0 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
11bf0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
11c00 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
11c10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
11c20 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
11c30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11c40 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
11c50 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
11c60 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
11c70 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
11c80 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
11c90 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
11ca0 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
11cb0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
11cd0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
11ce0 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
11cf0 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
11d00 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
11d10 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
11d20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
11d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
11d40 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
11d50 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
11d60 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
11d70 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11d80 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
11d90 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
11da0 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
11db0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11dc0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11dd0 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
11de0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11df0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
11e00 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
11e10 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
11e20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
11e30 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
11e40 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
11e50 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
11e60 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
11e70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11e80 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
11e90 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
11ea0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
11eb0 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
11ec0 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
11ed0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11ee0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
11ef0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
11f00 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
11f10 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11f20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11f30 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
11f40 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
11f50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
11f60 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
11f70 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
11f80 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
11f90 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
11fa0 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
11fb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11fc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11fd0 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
11fe0 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11ff0 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   nPage);.  if( r
12000 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12010 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
12020 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ze = nPage;.  }.
12030 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12040 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
12050 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
12060 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
12070 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
12080 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
12090 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
120a0 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
120b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
120c0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
120d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
120e0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
120f0 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
12100 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
12110 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
12120 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
12130 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
12140 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
12150 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
12160 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
12170 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
12180 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
12190 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
121a0 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
121b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
121c0 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
121d0 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
121e0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
121f0 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
12200 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
12210 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
12220 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
12230 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
12240 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
12250 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
12260 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
12270 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
12280 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
12290 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
122a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
122b0 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
122c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
122d0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
122e0 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
122f0 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
12300 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
12310 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
12320 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
12330 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
12340 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
12350 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
12360 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
12370 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
12380 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
12390 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
123a0 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
123b0 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
123c0 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
123d0 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
123e0 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
123f0 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54  be set..  */.  T
12400 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
12410 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
12420 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
12430 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73   pPager );.  ass
12440 65 72 74 28 20 70 54 73 64 20 26 26 20 70 54 73  ert( pTsd && pTs
12450 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e  d->nAlloc );.#en
12460 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73  dif..  disable_s
12470 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12480 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rs();.  pPager->
12490 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
124a0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
124b0 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
124c0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
124d0 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
124e0 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
124f0 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
12500 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
12510 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
12520 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
12530 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
12540 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
12550 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
12560 29 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  )).  assert( pPa
12570 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12580 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
12590 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65  Open==0 && pPage
125a0 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20  r->stmtOpen==0) 
125b0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
125c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
125d0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
125e0 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
125f0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
12600 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
12610 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
12620 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
12630 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
12640 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
12650 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
12660 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
12670 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
12680 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
12690 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
126a0 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
126b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
126c0 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
126d0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
126e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
126f0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
12700 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
12710 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
12720 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
12730 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
12740 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
12750 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
12760 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54  rting at .  ** T
12770 68 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72  hreadData.pPager
12780 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   if memory-manag
12790 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
127a0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
127b0 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65  ger==pTsd->pPage
127c0 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70  r ){.    pTsd->p
127d0 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  Pager = pPager->
127e0 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
127f0 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b      Pager *pTmp;
12800 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20  .    for(pTmp = 
12810 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54  pTsd->pPager; pT
12820 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65  mp->pNext!=pPage
12830 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  r; pTmp=pTmp->pN
12840 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d  ext){}.    pTmp-
12850 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d  >pNext = pPager-
12860 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64  >pNext;.  }.#end
12870 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  if.  sqliteFree(
12880 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
12890 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
128a0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
128b0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
128c0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
128d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
128e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
128f0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
12900 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
12910 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
12920 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
12930 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
12940 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
12950 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
12960 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
12970 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
12980 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
12990 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
129a0 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
129b0 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
129c0 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
129d0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
129e0 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
129f0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
12a00 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
12a10 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
12a20 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
12a30 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
12a40 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
12a50 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
12a60 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
12a70 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
12a80 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
12a90 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
12aa0 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
12ab0 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
12ac0 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
12ad0 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
12ae0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
12af0 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
12b00 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
12b10 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
12b20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
12b30 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
12b40 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
12b50 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
12b60 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65   pPg==pPg->pPage
12b70 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
12b80 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
12b90 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
12ba0 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ee;.      while(
12bb0 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
12bc0 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
12bd0 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70  tFree; }.      p
12be0 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
12bf0 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
12c00 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
12c10 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
12c20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
12c30 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
12c40 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
12c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c60 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
12c70 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
12c80 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
12c90 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
12ca0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
12cb0 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
12cc0 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
12cd0 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
12ce0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
12cf0 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
12d00 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
12d10 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
12d20 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
12d30 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
12d40 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
12d50 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
12d60 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
12d70 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
12d80 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
12d90 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12da0 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
12db0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
12dc0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
12dd0 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
12de0 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
12df0 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
12e00 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
12e10 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
12e20 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
12e30 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
12e40 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
12e50 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
12e60 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
12e70 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
12e80 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
12e90 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
12ea0 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
12eb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12ec0 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
12ed0 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  g){.  page_ref(p
12ee0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
12ef0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12f00 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
12f10 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
12f20 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
12f30 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
12f40 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
12f50 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
12f60 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
12f70 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
12f80 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
12f90 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
12fa0 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
12fb0 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
12fc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
12fd0 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
12fe0 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
12ff0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
13000 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
13010 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
13020 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
13030 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
13040 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
13050 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
13060 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
13070 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
13080 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
13090 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
130a0 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
130b0 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
130c0 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
130d0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
130e0 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
130f0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
13100 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
13110 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
13120 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
13130 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
13140 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
13150 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
13160 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
13170 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
13180 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
13190 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
131a0 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
131b0 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
131c0 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
131d0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
131e0 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
131f0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
13200 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
13210 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
13220 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
13230 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
13240 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
13250 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
13260 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
13270 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
13280 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
13290 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
132a0 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
132b0 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
132c0 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
132d0 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
132e0 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
132f0 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
13300 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
13310 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
13320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13330 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
13340 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
13350 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
13360 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
13370 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
13380 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
13390 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
133a0 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
133b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
133c0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
133d0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
133e0 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
133f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13400 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
13410 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
13420 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
13430 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
13440 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
13450 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
13460 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
13470 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
13480 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
13490 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
134a0 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
134b0 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
134c0 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
134d0 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
134e0 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
134f0 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
13500 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
13510 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
13520 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
13530 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
13540 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
13550 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
13560 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13570 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
13580 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
13590 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
135a0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
135b0 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
135c0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
135d0 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
135e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
135f0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
13600 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
13610 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
13620 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
13630 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
13640 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
13650 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
13660 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
13670 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
13680 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
13690 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
136a0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
136b0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
136c0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
136d0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
136e0 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
136f0 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
13700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
13710 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
13720 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
13730 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
13740 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
13750 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13760 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
13770 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
13780 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
13790 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
137a0 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
137b0 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
137c0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
137d0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
137e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
137f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13800 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
13810 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
13820 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
13830 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
13840 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
13850 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
13860 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13870 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f  n rc;.        IO
13880 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
13890 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
138a0 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
138b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
138c0 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
138d0 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
138e0 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63  , 4)).        rc
138f0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
13900 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
13910 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
13920 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
13930 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
13940 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
13950 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
13960 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13970 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
13980 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13990 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
139a0 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
139b0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
139c0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
139d0 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
139e0 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22  CE(("JSYNC %d\n"
139f0 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
13a00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
13a10 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
13a20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
13a30 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ync);.      if( 
13a40 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
13a50 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
13a60 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
13a70 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
13a80 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
13a90 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
13aa0 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
13ab0 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
13ac0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
13ad0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
13ae0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
13af0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
13b00 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
13b10 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
13b20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
13b30 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
13b40 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
13b50 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
13b60 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
13b70 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
13b80 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
13b90 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
13ba0 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
13bb0 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
13bc0 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
13bd0 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
13be0 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
13bf0 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
13c00 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
13c10 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
13c20 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
13c30 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
13c40 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
13c50 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
13c60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13c70 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
13c80 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
13c90 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
13ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13cb0 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
13cc0 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
13cd0 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
13ce0 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
13cf0 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
13d00 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
13d10 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
13d20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
13d30 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
13d40 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
13d50 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
13d60 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
13d70 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
13d80 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
13d90 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
13da0 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
13db0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
13dc0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
13dd0 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
13de0 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
13df0 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
13e00 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
13e10 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
13e20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
13e30 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
13e40 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
13e50 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
13e60 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13e70 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
13e80 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
13e90 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
13ea0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
13eb0 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
13ec0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
13ed0 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
13ee0 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
13ef0 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
13f00 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
13f10 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
13f20 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
13f30 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
13f40 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
13f50 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
13f60 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
13f70 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
13f80 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
13f90 4b 45 54 20 32 35 0a 73 74 61 74 69 63 20 50 67  KET 25.static Pg
13fa0 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69  Hdr *sort_pageli
13fb0 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a  st(PgHdr *pIn){.
13fc0 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52    PgHdr *a[N_SOR
13fd0 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0a 20  T_BUCKET], *p;. 
13fe0 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74   int i;.  memset
13ff0 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29  (a, 0, sizeof(a)
14000 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20  );.  while( pIn 
14010 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a  ){.    p = pIn;.
14020 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69      pIn = p->pDi
14030 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
14040 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ty = 0;.    for(
14050 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=0; i<N_SORT_BU
14060 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  CKET-1; i++){.  
14070 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20      if( a[i]==0 
14080 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  ){.        a[i] 
14090 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = p;.        bre
140a0 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
140b0 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72  .        p = mer
140c0 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
140d0 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b  , p);.        a[
140e0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
140f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
14100 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  =N_SORT_BUCKET-1
14110 20 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d   ){.      a[i] =
14120 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
14130 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  a[i], p);.    }.
14140 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a    }.  p = a[0];.
14150 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53    for(i=1; i<N_S
14160 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29  ORT_BUCKET; i++)
14170 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f  {.    p = merge_
14180 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d  pagelist(p, a[i]
14190 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
141a0 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
141b0 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
141c0 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
141d0 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
141e0 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
141f0 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
14200 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
14210 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14220 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
14230 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
14240 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
14250 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
14260 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
14270 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
14280 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
14290 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
142a0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
142b0 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
142c0 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
142d0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
142e0 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
142f0 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
14300 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
14310 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
14320 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
14330 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
14340 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
14350 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
14360 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
14370 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
14380 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
14390 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
143a0 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
143b0 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
143c0 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
143d0 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
143e0 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
143f0 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
14400 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
14410 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
14420 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
14430 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
14440 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
14450 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
14460 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
14470 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
14480 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
14490 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
144a0 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
144b0 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
144c0 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
144d0 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
144e0 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
144f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
14500 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
14510 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
14520 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
14530 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
14540 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
14550 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
14560 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
14570 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
14580 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
14590 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
145a0 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
145b0 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
145c0 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
145d0 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
145e0 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
145f0 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
14600 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
14610 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
14620 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
14630 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
14640 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
14650 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
14660 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
14670 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
14680 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14690 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
146a0 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
146b0 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
146c0 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
146d0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
146e0 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
146f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14700 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
14710 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
14720 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
14730 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
14740 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
14750 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ;.    /* If ther
14760 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
14770 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
14780 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
14790 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
147a0 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
147b0 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
147c0 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
147d0 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
147e0 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
147f0 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
14800 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
14810 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
14820 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
14830 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
14840 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
14850 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14860 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
14870 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
14880 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
14890 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28  *pData = CODEC2(
148a0 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
148b0 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
148c0 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
148d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
148e0 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
148f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
14900 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
14910 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  gno);.      IOTR
14920 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
14930 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
14940 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  ist->pgno)).    
14950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
14960 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
14970 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
14980 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14990 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
149a0 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
149b0 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
149c0 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
149d0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
149e0 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
149f0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
14a00 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
14a10 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
14a20 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
14a30 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c  eturn rc;.    pL
14a40 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  ist->dirty = 0;.
14a50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
14a60 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c  ECK_PAGES.    pL
14a70 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  ist->pageHash = 
14a80 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
14a90 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  List);.#endif.  
14aa0 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
14ab0 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
14ac0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
14ae0 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
14af0 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
14b00 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
14b10 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
14b20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
14b30 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
14b40 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
14b50 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
14b60 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
14b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
14b80 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
14b90 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
14ba0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
14bb0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44  eturn pPager->pD
14bc0 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
14bd0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
14be0 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
14bf0 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
14c00 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
14c10 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
14c20 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
14c30 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
14c40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
14c50 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
14c60 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
14c70 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
14c80 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
14c90 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
14ca0 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
14cb0 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
14cc0 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
14cd0 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
14ce0 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
14cf0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
14d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14d10 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
14d20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14d30 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65  if( !pPager->use
14d40 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  Journal ) return
14d50 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
14d60 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
14d70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
14d80 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14d90 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  f( sqlite3OsChec
14da0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
14db0 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75  ager->fd) ) retu
14dc0 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
14dd0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
14de0 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
14df0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
14e00 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
14e10 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  rnal);.    retur
14e20 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
14e30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
14e40 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
14e50 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
14e60 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61  he cache that ca
14e70 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a  n be recycled. .
14e80 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14e90 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ne may return SQ
14ea0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
14eb0 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54  TE_FULL or SQLIT
14ec0 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65  E_OK. It .** doe
14ed0 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50  s not set the pP
14ee0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61  ager->errCode va
14ef0 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
14f00 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79  c int pager_recy
14f10 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  cle(Pager *pPage
14f20 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50  r, int syncOk, P
14f30 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
14f40 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
14f50 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  pPg = 0;..  /* F
14f60 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
14f70 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
14f80 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
14f90 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
14fa0 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
14fb0 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
14fc0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
14fd0 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
14fe0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
14ff0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
15000 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
15010 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
15020 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
15030 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
15040 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
15050 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
15060 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
15070 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
15080 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
15090 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
150a0 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
150b0 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
150c0 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
150d0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
150e0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
150f0 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20  First && syncOk 
15100 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20  && !MEMDB){.    
15110 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
15120 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
15130 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
15140 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
15150 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
15160 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
15170 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
15180 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
15190 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
151a0 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
151b0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
151c0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
151d0 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
151e0 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
151f0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
15200 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
15210 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
15220 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
15230 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
15240 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
15250 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
15260 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
15270 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
15280 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
15290 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
152a0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
152b0 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
152c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
152d0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
152e0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
152f0 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
15300 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
15310 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
15320 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
15330 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
15340 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
15350 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
15360 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
15370 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15380 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
15390 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
153a0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
153b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
153c0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
153d0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
153e0 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
153f0 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
15400 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
15410 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
15420 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
15430 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
15440 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
15450 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
15460 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
15470 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  );.    pPg->dirt
15480 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
15490 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
154a0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
154b0 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
154c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
154d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
154e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
154f0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
15500 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
15510 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
15520 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
15530 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
15540 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
15550 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74   then.  ** set t
15560 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
15570 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
15580 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
15590 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61  e.  ** sqlite3Pa
155a0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
155b0 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66  ) optimization f
155c0 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  or the rest of t
155d0 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  his transaction.
155e0 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65  .  ** It is nece
155f0 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
15600 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
15610 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
15620 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67  ollback.  ** mig
15630 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61  ht be reloaded a
15640 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62  t a later time b
15650 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ut at that point
15660 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62   we won't rememb
15670 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20  er.  ** that is 
15680 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  was marked alway
15690 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73  sRollback.  This
156a0 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20   means that all 
156b0 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20  pages must.  ** 
156c0 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77  be marked as alw
156d0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d  aysRollback from
156e0 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20   here on out..  
156f0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  */.  if( pPg->al
15700 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
15710 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c      IOTRACE(("AL
15720 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70  WAYS_ROLLBACK %p
15730 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
15740 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
15750 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
15760 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74  }..  /* Unlink t
15770 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d  he old page from
15780 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61   the free list a
15790 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  nd the hash tabl
157a0 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50  e.  */.  unlinkP
157b0 61 67 65 28 70 50 67 29 3b 0a 20 20 54 45 53 54  age(pPg);.  TEST
157c0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
157d0 76 66 6c 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d  vfl);..  *ppPg =
157e0 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
157f0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15800 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15810 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 66 72   is called to fr
15820 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73 20 64  ee superfluous d
15830 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63  ynamically alloc
15840 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68  ated memory.** h
15850 65 6c 64 20 62 79 20 74 68 65 20 70 61 67 65 72  eld by the pager
15860 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72 79 20   system. Memory 
15870 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20 53 51  in use by any SQ
15880 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c 6f 63  Lite pager alloc
15890 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 63  ated.** by the c
158a0 75 72 72 65 6e 74 20 74 68 72 65 61 64 20 6d 61  urrent thread ma
158b0 79 20 62 65 20 73 71 6c 69 74 65 46 72 65 65 28  y be sqliteFree(
158c0 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20  )ed..**.** nReq 
158d0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
158e0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
158f0 20 72 65 71 75 69 72 65 64 2e 20 4f 6e 63 65 20   required. Once 
15900 74 68 69 73 20 6d 75 63 68 20 68 61 73 0a 2a 2a  this much has.**
15910 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2c 20   been released, 
15920 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  the function ret
15930 75 72 6e 73 2e 20 41 20 6e 65 67 61 74 69 76 65  urns. A negative
15940 20 76 61 6c 75 65 20 66 6f 72 20 6e 52 65 71 20   value for nReq 
15950 6d 65 61 6e 73 0a 2a 2a 20 66 72 65 65 20 61 73  means.** free as
15960 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20   much memory as 
15970 70 6f 73 73 69 62 6c 65 2e 20 54 68 65 20 72 65  possible. The re
15980 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
15990 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
159a0 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
159b0 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
159c0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
159d0 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
159e0 41 4e 41 47 45 4d 45 4e 54 0a 69 6e 74 20 73 71  ANAGEMENT.int sq
159f0 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
15a00 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
15a10 29 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61  ){.  const Threa
15a20 64 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20  dData *pTsdro = 
15a30 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
15a40 61 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 50  aReadOnly();.  P
15a50 61 67 65 72 20 2a 70 3b 0a 20 20 69 6e 74 20 6e  ager *p;.  int n
15a60 52 65 6c 65 61 73 65 64 20 3d 20 30 3b 0a 20 20  Released = 0;.  
15a70 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
15a80 74 68 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  the the global m
15a90 75 74 65 78 20 69 73 20 68 65 6c 64 2c 20 74 68  utex is held, th
15aa0 69 73 20 73 75 62 72 6f 75 74 69 6e 65 20 62 65  is subroutine be
15ab0 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f  comes a.  ** o-o
15ac0 70 3b 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66  p; zero bytes of
15ad0 20 6d 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65   memory are free
15ae0 64 2e 20 20 54 68 69 73 20 69 73 20 62 65 63 61  d.  This is beca
15af0 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65 20 6f 66  use.  ** some of
15b00 20 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65   the code invoke
15b10 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
15b20 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a  on may also.  **
15b30 20 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74   try to obtain t
15b40 68 65 20 6d 75 74 65 78 2c 20 72 65 73 75 6c 74  he mutex, result
15b50 69 6e 67 20 69 6e 20 61 20 64 65 61 64 6c 6f 63  ing in a deadloc
15b60 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  k..  */.  if( sq
15b70 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65 78 28 30  lite3OsInMutex(0
15b80 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
15b90 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74  0;.  }..  /* Out
15ba0 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73  ermost loop runs
15bb0 20 66 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f   for at most two
15bc0 20 69 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72   iterations. Fir
15bd0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a  st iteration we.
15be0 20 20 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64    ** try to find
15bf0 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e   memory that can
15c00 20 62 65 20 72 65 6c 65 61 73 65 64 20 77 69 74   be released wit
15c10 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79  hout calling fsy
15c20 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a  nc(). Second.  *
15c30 2a 20 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69  * iteration (whi
15c40 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20  ch only runs if 
15c50 74 68 65 20 66 69 72 73 74 20 66 61 69 6c 65 64  the first failed
15c60 20 74 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79   to free nReq by
15c70 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f  tes of.  ** memo
15c80 72 79 29 20 69 73 20 70 65 72 6d 69 74 74 65 64  ry) is permitted
15c90 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29   to call fsync()
15ca0 2e 20 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75  . This is of cou
15cb0 72 73 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20  rse much more . 
15cc0 20 2a 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20   ** expensive.. 
15cd0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
15ce0 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20  <=1; i++){..    
15cf0 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
15d00 61 6c 6c 20 74 68 65 20 53 51 4c 69 74 65 20 70  all the SQLite p
15d10 61 67 65 72 73 20 6f 70 65 6e 65 64 20 62 79 20  agers opened by 
15d20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
15d30 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ad. */.    for(p
15d40 3d 70 54 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b  =pTsdro->pPager;
15d50 20 70 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c   p && (nReq<0 ||
15d60 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
15d70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
15d80 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b       PgHdr *pPg;
15d90 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a  .      int rc;..
15da0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 65 61 63        /* For eac
15db0 68 20 70 61 67 65 72 2c 20 74 72 79 20 74 6f 20  h pager, try to 
15dc0 66 72 65 65 20 61 73 20 6d 61 6e 79 20 70 61 67  free as many pag
15dd0 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 28  es as possible (
15de0 77 69 74 68 6f 75 74 20 0a 20 20 20 20 20 20 2a  without .      *
15df0 2a 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28  * calling fsync(
15e00 29 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  ) if this is the
15e10 20 66 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e   first iteration
15e20 20 6f 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73   of the outermos
15e30 74 20 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70  t .      ** loop
15e40 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  )..      */.    
15e50 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f    while( SQLITE_
15e60 4f 4b 3d 3d 28 72 63 20 3d 20 70 61 67 65 72 5f  OK==(rc = pager_
15e70 72 65 63 79 63 6c 65 28 70 2c 20 69 2c 20 26 70  recycle(p, i, &p
15e80 50 67 29 29 20 26 26 20 70 50 67 29 20 7b 0a 20  Pg)) && pPg) {. 
15e90 20 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20         /* We've 
15ea0 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20  found a page to 
15eb0 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f  free. At this po
15ec0 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73  int the page has
15ed0 20 62 65 65 6e 20 0a 20 20 20 20 20 20 20 20 2a   been .        *
15ee0 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
15ef0 68 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62  he page hash-tab
15f00 6c 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  le, free-list an
15f10 64 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20  d synced-list . 
15f20 20 20 20 20 20 20 20 2a 2a 20 28 70 46 69 72 73         ** (pFirs
15f30 74 53 79 6e 63 65 64 29 2e 20 49 74 20 69 73 20  tSynced). It is 
15f40 73 74 69 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c  still in the all
15f50 20 70 61 67 65 73 20 28 70 41 6c 6c 29 20 6c 69   pages (pAll) li
15f60 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  st. .        ** 
15f70 52 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74  Remove it from t
15f80 68 69 73 20 6c 69 73 74 20 62 65 66 6f 72 65 20  his list before 
15f90 66 72 65 65 69 6e 67 2e 0a 20 20 20 20 20 20 20  freeing..       
15fa0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
15fb0 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
15fc0 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
15fd0 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
15fe0 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
15ff0 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
16000 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
16010 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
16020 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20  gHdr *pTmp;.    
16030 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20      assert( pPg 
16040 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f  );.        page_
16050 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
16060 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
16070 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 2d 3e      if( pPg==p->
16080 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  pAll ){.        
16090 20 20 20 70 2d 3e 70 41 6c 6c 20 3d 20 70 50 67     p->pAll = pPg
160a0 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
160b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
160c0 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d 70       for( pTmp=p
160d0 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
160e0 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
160f0 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
16100 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
16110 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
16120 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
16130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16140 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
16150 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
16160 67 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  g);.        sqli
16170 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
16180 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
16190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
161a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65  .        /* An e
161b0 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
161c0 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74  lst writing to t
161d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
161e0 20 6f 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   or .        ** 
161f0 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72  journal in pager
16200 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20  _recycle(). The 
16210 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74  error is not ret
16220 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20  urned to the .  
16230 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
16240 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
16250 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
16260 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
16270 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
16280 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
16290 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
162a0 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
162b0 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
162c0 61 73 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ase .        ** 
162d0 6f 66 20 61 20 73 68 61 72 65 64 20 70 61 67 65  of a shared page
162e0 72 20 63 61 63 68 65 29 20 6f 66 20 74 68 65 20  r cache) of the 
162f0 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68 20  pager for which 
16300 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65  the error occure
16310 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d..        */.  
16320 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 72        assert( (r
16330 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
16340 49 4f 45 52 52 20 7c 7c 20 72 63 3d 3d 53 51 4c  IOERR || rc==SQL
16350 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 20 20 20 20  ITE_FULL );.    
16360 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73      assert( p->s
16370 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
16380 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20 20 20  RVED );.        
16390 70 61 67 65 72 5f 65 72 72 6f 72 28 70 2c 20 72  pager_error(p, r
163a0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
163b0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
163c0 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23 65 6e  nReleased;.}.#en
163d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
163e0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
163f0 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  GEMENT */../*.**
16400 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
16410 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  s called to obta
16420 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  in the shared lo
16430 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f  ck required befo
16440 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62  re.** data may b
16450 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
16460 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
16470 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
16480 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62  has already.** b
16490 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  een obtained, th
164a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
164b0 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d   no-op..**.** Im
164c0 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20  mediately after 
164d0 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68  obtaining the sh
164e0 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65  ared lock (if re
164f0 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75  quired), this fu
16500 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73  nction.** checks
16510 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
16520 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20  al file. If one 
16530 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65  is found, an eme
16540 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a  rgency rollback.
16550 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ** is performed 
16560 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a  immediately..*/.
16570 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16580 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72  SharedLock(Pager
16590 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
165a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
165b0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
165c0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
165d0 4f 43 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21  OCK ){.    if( !
165e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
165f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
16600 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
16610 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
16620 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
16630 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
16640 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
16650 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
16660 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
16670 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16680 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
16690 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
166a0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
166b0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
166c0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
166d0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
166e0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
166f0 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
16700 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
16710 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
16720 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
16730 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
16740 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
16750 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
16760 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
16770 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
16780 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
16790 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
167a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
167b0 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
167c0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
167d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
167e0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
167f0 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
16800 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
16810 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
16820 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
16830 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
16840 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
16850 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
16860 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
16870 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
16880 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
16890 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
168a0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
168b0 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
168c0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
168d0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
168e0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
168f0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
16900 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
16910 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
16920 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
16930 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
16940 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
16950 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
16960 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
16970 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
16980 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
16990 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
169a0 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
169b0 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
169c0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
169d0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
169e0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
169f0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16a00 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
16a10 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
16a20 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
16a30 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
16a40 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
16a50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
16a60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16a70 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
16a80 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
16a90 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
16aa0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
16ab0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
16ac0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
16ad0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
16ae0 4c 55 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20  LUSIVE;. .      
16af0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
16b00 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
16b10 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
16b20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
16b30 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65         ** we are
16b40 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20   unable to open 
16b50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
16b60 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  . .        **.  
16b70 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75        ** The jou
16b80 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e  rnal file does n
16b90 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f  ot need to be lo
16ba0 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68  cked itself.  Th
16bb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  e.        ** jou
16bc0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
16bd0 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
16be0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
16bf0 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
16c00 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
16c10 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
16c20 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
16c30 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
16c40 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  .        ** proc
16c50 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
16c60 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
16c70 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
16c80 20 20 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20      **..** Open 
16c90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
16ca0 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
16cb0 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75  s. This is becau
16cc0 73 65 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75  se in ..** exclu
16cd0 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
16ce0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
16cf0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70  ptor will be kep
16d00 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20  t open and.     
16d10 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75     ** possibly u
16d20 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61  sed for a transa
16d30 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20  ction later on. 
16d40 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c  On some systems,
16d50 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
16d60 4f 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c  OsTruncate() cal
16d70 6c 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73  l used in exclus
16d80 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
16d90 61 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20  also requires.  
16da0 20 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f        ** a read/
16db0 77 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c  write file handl
16dc0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
16dd0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16de0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
16df0 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
16e00 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e  eExists(pPager->
16e10 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
16e20 20 20 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20         int ro;. 
16e30 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16e40 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
16e50 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
16e60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
16e70 65 6e 52 65 61 64 57 72 69 74 65 28 70 50 61 67  enReadWrite(pPag
16e80 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
16e90 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29  Pager->jfd, &ro)
16ea0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16eb0 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
16ec0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
16ed0 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  SY;.          }.
16ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16ef0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
16f10 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
16f20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
16f30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
16f40 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  USY;.        }. 
16f50 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
16f60 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
16f70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
16f80 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
16f90 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
16fa0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
16fb0 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
16fc0 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
16fd0 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  0;.        pPage
16fe0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
16ff0 30 3b 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  0;. .        /* 
17000 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c  Playback and del
17010 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ete the journal.
17020 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62    Drop the datab
17030 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20 20  ase write.      
17040 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
17050 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
17060 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   lock..        *
17070 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  /.        rc = p
17080 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
17090 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20  ager, 1);.      
170a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
170b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
170c0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
170d0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
170e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
170f0 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
17100 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
17110 48 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20  HARED || .      
17120 20 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65        (pPager->e
17130 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
17140 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41  pPager->state>PA
17150 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20  GER_SHARED).    
17160 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a      );.      }..
17170 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
17180 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
17190 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 31 20    PgHdr *pPage1 
171a0 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
171b0 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
171c0 20 20 20 69 66 28 20 70 50 61 67 65 31 20 29 7b     if( pPage1 ){
171d0 0a 20 20 20 20 20 20 20 20 20 20 75 6e 6c 69 6e  .          unlin
171e0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
171f0 72 2c 20 70 50 61 67 65 31 29 3b 0a 20 20 20 20  r, pPage1);.    
17200 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 61      }..        a
17210 73 73 65 72 74 28 20 21 70 61 67 65 72 5f 6c 6f  ssert( !pager_lo
17220 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31 29 20  okup(pPager, 1) 
17230 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
17240 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
17250 69 72 65 28 70 50 61 67 65 72 2c 20 31 2c 20 26  ire(pPager, 1, &
17260 70 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 20 20  pPage1, 0);.    
17270 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
17280 54 45 5f 4f 4b 20 29 7b 0a 09 20 20 2f 2a 20 54  TE_OK ){..  /* T
17290 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
172a0 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 6f  r is stored at o
172b0 66 66 73 65 74 20 32 34 2e 20 53 65 65 20 61 6c  ffset 24. See al
172c0 73 6f 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  so.          ** 
172d0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
172e0 65 63 6f 75 6e 74 65 72 28 29 2e 0a 20 20 20 20  ecounter()..    
172f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
17300 20 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f     u32 iChangeCo
17310 75 6e 74 20 3d 20 72 65 74 72 69 65 76 65 33 32  unt = retrieve32
17320 62 69 74 73 28 70 50 61 67 65 31 2c 20 32 34 29  bits(pPage1, 24)
17330 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
17340 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  er->nRef++;.    
17350 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
17360 65 72 55 6e 72 65 66 28 70 50 61 67 65 31 29 3b  erUnref(pPage1);
17370 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
17380 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  r->nRef--;.     
17390 20 20 20 20 20 69 66 28 20 69 43 68 61 6e 67 65       if( iChange
173a0 43 6f 75 6e 74 21 3d 70 50 61 67 65 72 2d 3e 69  Count!=pPager->i
173b0 43 68 61 6e 67 65 43 6f 75 6e 74 20 29 7b 0a 20  ChangeCount ){. 
173c0 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72             pager
173d0 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
173e0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
173f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43        pPager->iC
17400 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 69 43 68  hangeCount = iCh
17410 61 6e 67 65 43 6f 75 6e 74 3b 0a 20 20 20 20 20  angeCount;.     
17420 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
17430 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
17440 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
17450 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mode || pPager->
17460 73 74 61 74 65 3c 3d 50 41 47 45 52 5f 53 48 41  state<=PAGER_SHA
17470 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  RED );.    if( p
17480 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17490 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
174a0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
174b0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
174c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
174d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
174e0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
174f0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
17500 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
17510 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
17520 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
17530 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
17540 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
17550 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
17560 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
17570 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
17580 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f  .**.** A _get wo
17590 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65  rks for any page
175a0 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
175b0 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20  than 0.  If the 
175c0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
175d0 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
175e0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70   the requested p
175f0 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74  age, then no act
17600 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64  ual disk.** read
17610 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
17620 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20  memory image of 
17630 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69 74  the page is init
17640 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c  ialized to.** al
17650 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78  l zeros.  The ex
17660 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64 65  tra data appende
17670 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20 61  d to a page is a
17680 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65  lways initialize
17690 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68  d.** to zeros th
176a0 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20 70  e first time a p
176b0 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e  age is loaded in
176c0 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a  to memory..**.**
176d0 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e   The acquisition
176e0 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20   might fail for 
176f0 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e  several reasons.
17700 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a    In all cases,.
17710 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ** an appropriat
17720 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
17730 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70  returned and *pp
17740 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Page is set to N
17750 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ULL..**.** See a
17760 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
17770 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20  Lookup().  Both 
17780 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64  this routine and
17790 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d   _lookup() attem
177a0 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20  pt.** to find a 
177b0 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d  page in the in-m
177c0 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73  emory cache firs
177d0 74 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  t.  If the page 
177e0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a  is not already.*
177f0 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69  * in memory, thi
17800 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74  s routine goes t
17810 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69  o disk to read i
17820 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f  t in whereas _lo
17830 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72  okup().** just r
17840 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20  eturns 0.  This 
17850 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73  routine acquires
17860 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65   a read-lock the
17870 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a   first time it.*
17880 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64  * has to go to d
17890 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61  isk, and could a
178a0 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20  lso playback an 
178b0 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  old journal if n
178c0 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e  ecessary..** Sin
178d0 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76  ce _lookup() nev
178e0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
178f0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
17900 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
17910 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
17920 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  iles..**.** If c
17930 6c 72 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c  lrFlag is false,
17940 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
17950 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c 79 20  ts are actually 
17960 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a  read from disk..
17970 2a 2a 20 49 66 20 63 6c 66 46 6c 61 67 20 69 73  ** If clfFlag is
17980 20 74 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20   true, it means 
17990 74 68 65 20 70 61 67 65 20 69 73 20 61 62 6f 75  the page is abou
179a0 74 20 74 6f 20 62 65 20 65 72 61 73 65 64 20 61  t to be erased a
179b0 6e 64 0a 2a 2a 20 72 65 77 72 69 74 74 65 6e 20  nd.** rewritten 
179c0 77 69 74 68 6f 75 74 20 66 69 72 73 74 20 62 65  without first be
179d0 69 6e 67 20 72 65 61 64 20 73 6f 20 74 68 65 72  ing read so ther
179e0 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74 20 69 74  e is no point it
179f0 20 64 6f 69 6e 67 0a 2a 2a 20 74 68 65 20 64 69   doing.** the di
17a00 73 6b 20 49 2f 4f 2e 0a 2a 2f 0a 69 6e 74 20 73  sk I/O..*/.int s
17a10 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69  qlite3PagerAcqui
17a20 72 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  re(Pager *pPager
17a30 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 44 62 50  , Pgno pgno, DbP
17a40 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 69 6e  age **ppPage, in
17a50 74 20 63 6c 72 46 6c 61 67 29 7b 0a 20 20 50 67  t clrFlag){.  Pg
17a60 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
17a70 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
17a80 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
17a90 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50  GER_UNLOCK || pP
17aa0 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20  ager->nRef>0 || 
17ab0 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  pgno==1 );..  /*
17ac0 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
17ad0 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
17ae0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
17af0 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
17b00 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72  e.  ** number gr
17b10 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
17b20 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71   or zero, is req
17b30 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  uested..  */.  i
17b40 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
17b50 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
17b60 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
17b70 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
17b80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17b90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
17ba0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  PT;.  }..  /* Ma
17bb0 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
17bc0 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74  not hit any crit
17bd0 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a  ical errors..  *
17be0 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  / .  assert( pPa
17bf0 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50  ger!=0 );.  *ppP
17c00 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  age = 0;.  if( p
17c10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
17c20 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
17c30 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
17c40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
17c50 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
17c60 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
17c70 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
17c80 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
17c90 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
17ca0 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
17cb0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61  atabase file. pa
17cc0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
17cd0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20  is a no-op if . 
17ce0 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c   ** a database l
17cf0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
17d00 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
17d10 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
17d20 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
17d30 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17d40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17d50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
17d60 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
17d70 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
17d80 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
17d90 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
17da0 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
17db0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
17dc0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
17dd0 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
17de0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
17df0 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68   nMax;.    int h
17e00 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28  ;.    TEST_INCR(
17e10 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a  pPager->nMiss);.
17e20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17e30 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
17e40 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Page || pPager->
17e50 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d  pFirst==0 || MEM
17e60 44 42 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 70  DB ||.        (p
17e70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
17e80 63 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72  ced==0 && pPager
17e90 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a 20 20 20  ->doNotSync).   
17ea0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   ){.      /* Cre
17eb0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a  ate a new page *
17ec0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
17ed0 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67 65  er->nPage>=pPage
17ee0 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20 20  r->nHash ){.    
17ef0 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
17f00 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
17f10 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  er,.           p
17f20 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36  Pager->nHash<256
17f30 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d   ? 256 : pPager-
17f40 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20  >nHash*2);.     
17f50 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
17f60 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Hash==0 ){.     
17f70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
17f80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
17f90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
17fa0 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
17fb0 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
17fc0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
17fd0 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  pageSize.       
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
18000 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
18010 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
18020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18030 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
18040 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b  of(PgHistory) );
18050 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d  .      if( pPg==
18060 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
18070 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
18080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18090 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
180a0 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
180b0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
180c0 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
180d0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
180e0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
180f0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
18100 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18110 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
18120 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
18130 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
18140 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
18150 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
18160 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
18170 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
18180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
18190 61 67 65 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78  age>pPager->nMax
181a0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
181b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
181c0 6e 4d 61 78 50 61 67 65 3d 3d 28 70 50 61 67 65  nMaxPage==(pPage
181d0 72 2d 3e 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20  r->nPage-1) );. 
181e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
181f0 4d 61 78 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20  MaxPage++;.     
18200 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
18210 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72      rc = pager_r
18220 65 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 31  ecycle(pPager, 1
18230 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20 20 69  , &pPg);.      i
18240 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
18250 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
18260 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
18270 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
18280 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
18290 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20  ED_LOCK );.     
182a0 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20 20   assert(pPg);.  
182b0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
182c0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
182d0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
182e0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
182f0 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
18300 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
18310 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
18320 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
18330 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20  rnal, pgno/8);. 
18340 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
18350 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
18360 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
18370 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
18380 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
18390 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
183a0 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
183b0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
183c0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
183d0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
183e0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
183f0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
18400 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
18410 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
18420 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
18430 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a  Pager->stmtSize.
18440 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
18450 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
18460 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
18470 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a  pgno&7)))!=0 ){.
18480 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
18490 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
184a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
184b0 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
184c0 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
184d0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 61  g);.    }.    ma
184e0 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
184f0 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
18500 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
18510 29 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  );..    pPager->
18520 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20  nRef++;.    if( 
18530 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30  pPager->nExtra>0
18540 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
18550 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  (PGHDR_TO_EXTRA(
18560 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c  pPg, pPager), 0,
18570 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29   pPager->nExtra)
18580 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78  ;.    }.    nMax
18590 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
185a0 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
185b0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
185c0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
185d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
185e0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
185f0 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
18600 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74  rCode;.      ret
18610 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
18620 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
18630 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74  he page with dat
18640 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61  a, either by rea
18650 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
18660 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
18670 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e  le, or by settin
18680 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  g the entire pag
18690 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e to zero..    *
186a0 2f 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28  /.    if( nMax<(
186b0 69 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44  int)pgno || MEMD
186c0 42 20 7c 7c 20 28 63 6c 72 46 6c 61 67 20 26 26  B || (clrFlag &&
186d0 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73   !pPager->always
186e0 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20  Rollback) ){.   
186f0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
18700 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
18710 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
18720 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
18730 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d       assert( MEM
18740 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72  DB==0 );.      r
18750 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
18760 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  k(pPager->fd, (p
18770 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
18780 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18790 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
187a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
187b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
187c0 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
187d0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
187e0 50 67 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Pg),.           
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18800 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
18810 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
18820 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
18830 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  IN %p %d\n", pPa
18840 67 65 72 2c 20 70 67 6e 6f 29 29 0a 20 20 20 20  ger, pgno)).    
18850 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 46    PAGERTRACE3("F
18860 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
18870 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
18880 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
18890 0a 20 20 20 20 20 20 43 4f 44 45 43 31 28 70 50  .      CODEC1(pP
188a0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
188b0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
188c0 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
188d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
188e0 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
188f0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
18900 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  ){.        pPg->
18910 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  pgno = 0;.      
18920 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
18930 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
18940 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18960 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
18970 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20  er->nRead);.    
18980 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
18990 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65 20  * Link the page 
189a0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68 61  into the page ha
189b0 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  sh table */.    
189c0 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
189d0 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
189e0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
189f0 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  0 );.    pPg->pN
18a00 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
18a10 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
18a20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
18a30 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
18a40 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
18a50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
18a60 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
18a70 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
18a80 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
18a90 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
18aa0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23 69  = pPg;.    }..#i
18ab0 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
18ac0 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
18ad0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
18ae0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
18af0 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b  .#endif.  }else{
18b00 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
18b10 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
18b20 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
18b30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 70   */.    assert(p
18b40 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c  Pager->nRef>0 ||
18b50 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20 54   pgno==1);.    T
18b60 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
18b70 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65  >nHit);.    page
18b80 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
18b90 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
18ba0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18bb0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
18bc0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
18bd0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
18be0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
18bf0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
18c00 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
18c10 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
18c20 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
18c30 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
18c40 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
18c50 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
18c60 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
18c70 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20 20  te3PagerGet().  
18c80 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
18c90 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
18ca0 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
18cb0 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73 20  e3PagerGet() is 
18cc0 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
18cd0 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
18ce0 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
18cf0 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
18d00 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
18d10 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
18d20 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
18d30 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
18d40 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
18d50 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
18d60 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
18d70 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
18d80 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a  ned..*/.DbPage *
18d90 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
18da0 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
18db0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
18dc0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
18dd0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
18de0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
18df0 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  no!=0 );..  if( 
18e00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
18e10 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
18e20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
18e30 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67  er->pAll || pPag
18e40 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
18e50 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
18e60 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  0;.  }.  if( pPa
18e70 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
18e80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
18e90 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
18ea0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
18eb0 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f  }.  pPg = pager_
18ec0 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
18ed0 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d  gno);.  if( pPg=
18ee0 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
18ef0 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
18f00 20 20 72 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a    return pPg;.}.
18f10 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
18f20 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
18f30 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
18f40 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
18f50 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
18f60 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
18f70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
18f80 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
18f90 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
18fa0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
18fb0 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
18fc0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
18fd0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
18fe0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
18ff0 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
19000 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
19010 65 72 55 6e 72 65 66 28 44 62 50 61 67 65 20 2a  erUnref(DbPage *
19020 70 50 67 29 7b 0a 0a 20 20 2f 2a 20 44 65 63 72  pPg){..  /* Decr
19030 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
19040 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68  nce count for th
19050 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 61  is page.  */.  a
19060 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
19070 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  >0 );.  pPg->nRe
19080 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70  f--;.  REFINFO(p
19090 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  Pg);..  CHECK_PA
190a0 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
190b0 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
190c0 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
190d0 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
190e0 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
190f0 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
19100 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
19110 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
19120 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
19130 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  =0 ){.    Pager 
19140 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61  *pPager;.    pPa
19150 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
19160 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
19170 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70  tFree = 0;.    p
19180 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  Pg->pPrevFree = 
19190 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20  pPager->pLast;. 
191a0 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
191b0 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
191c0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29  pPg->pPrevFree )
191d0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
191e0 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65  evFree->pNextFre
191f0 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c  e = pPg;.    }el
19200 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72  se{.      pPager
19210 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a  ->pFirst = pPg;.
19220 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
19230 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26  g->needSync==0 &
19240 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
19250 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20  Synced==0 ){.   
19260 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
19270 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20  tSynced = pPg;. 
19280 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
19290 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
192a0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
192b0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 50  ->xDestructor(pP
192c0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
192d0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ize);.    }.  . 
192e0 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
192f0 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
19300 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
19310 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
19320 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
19330 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
19340 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
19350 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
19360 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
19370 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
19380 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
19390 28 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  (!pPager->exclus
193a0 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
193b0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 29  r->journalOff>0)
193c0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 55   ){.      pagerU
193d0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
193e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
193f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
19400 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19410 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
19420 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
19430 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
19440 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
19450 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
19460 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
19470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19480 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
19490 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
194a0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
194b0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
194c0 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
194d0 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
194e0 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
194f0 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
19500 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
19510 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
19520 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
19530 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19540 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
19550 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
19560 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19570 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
19580 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65  SERVED );.  asse
19590 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
195a0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
195b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
195c0 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
195d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
195e0 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  aInJournal==0 );
195f0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
19600 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
19610 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
19620 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d  ournal = sqliteM
19630 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
19640 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
19650 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
19660 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
19670 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19680 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
19690 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
196a0 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rnal;.  }.  rc =
196b0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
196c0 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
196d0 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
196e0 72 2d 3e 6a 66 64 2c 0a 20 20 20 20 20 20 20 20  r->jfd,.        
196f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19700 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
19710 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50  >tempFile);.  pP
19720 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
19730 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
19740 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
19750 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19760 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
19770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19780 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19790 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
197a0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
197b0 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
197c0 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  al);.    }.    g
197d0 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
197e0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
197f0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
19800 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
19810 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
19820 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
19830 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
19840 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
19850 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
19860 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
19870 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
19880 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
19890 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
198a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
198b0 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
198c0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
198d0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
198e0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
198f0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
19900 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
19910 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
19920 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
19930 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
19940 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
19950 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
19960 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
19970 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
19980 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
19990 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
199a0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
199b0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
199c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
199d0 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
199e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
199f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
19a00 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
19a10 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
19a20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
19a30 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
19a40 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
19a50 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
19a60 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
19a70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
19a90 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
19aa0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
19ab0 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
19ac0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
19ad0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
19ae0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
19af0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
19b00 75 72 6e 61 6c 20 3d 20 30 3b 0a 23 69 66 20 30  urnal = 0;.#if 0
19b10 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
19b20 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f  E_NOMEM ){.    /
19b30 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 20  * If this was a 
19b40 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
19b50 2c 20 74 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e  , then we will n
19b60 6f 74 20 62 65 20 63 6c 6f 73 69 6e 67 20 74 68  ot be closing th
19b70 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 66  e pager.    ** f
19b80 69 6c 65 2e 20 53 6f 20 64 65 6c 65 74 65 20 61  ile. So delete a
19b90 6e 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ny journal file 
19ba0 77 65 20 6d 61 79 20 68 61 76 65 20 6a 75 73 74  we may have just
19bb0 20 63 72 65 61 74 65 64 2e 20 4f 74 68 65 72 77   created. Otherw
19bc0 69 73 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20  ise,.    ** the 
19bd0 73 79 73 74 65 6d 20 77 69 6c 6c 20 67 65 74 20  system will get 
19be0 63 6f 6e 66 75 73 65 64 2c 20 77 65 20 68 61 76  confused, we hav
19bf0 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
19c00 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 61 0a   the file and a.
19c10 20 20 20 20 2a 2a 20 6d 79 73 74 65 72 69 6f 75      ** mysteriou
19c20 73 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 70  s journal has ap
19c30 70 65 61 72 65 64 20 69 6e 20 74 68 65 20 66 69  peared in the fi
19c40 6c 65 73 79 73 74 65 6d 2e 0a 20 20 20 20 2a 2f  lesystem..    */
19c50 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
19c60 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
19c70 7a 4a 6f 75 72 6e 61 6c 29 3b 20 2a 2f 0a 20 20  zJournal); */.  
19c80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
19c90 20 77 65 20 72 65 73 65 74 20 74 68 65 20 70 61   we reset the pa
19ca0 67 65 72 20 68 65 72 65 2c 20 77 65 20 77 69 6c  ger here, we wil
19cb0 6c 20 64 65 6c 65 74 65 20 70 61 67 65 73 20 6f  l delete pages o
19cc0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 0a 20 20  ut from under.  
19cd0 20 20 2a 2a 20 76 61 72 69 6f 75 73 20 63 75 72    ** various cur
19ce0 73 6f 72 73 20 61 6e 64 20 77 69 6c 6c 20 75 6c  sors and will ul
19cf0 74 69 6d 61 74 65 6c 79 20 73 65 67 66 61 75 6c  timately segfaul
19d00 74 2e 20 2a 2f 0a 20 20 20 20 2f 2a 20 70 61 67  t. */.    /* pag
19d10 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
19d20 3b 20 2a 2f 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ; */.  }.#endif.
19d30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19d40 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
19d50 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
19d60 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
19d70 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64   lock is removed
19d80 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79   when.** the any
19d90 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
19da0 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20  g happen:.**.** 
19db0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
19dc0 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
19dd0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
19de0 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65    *  sqlite3Page
19df0 72 52 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  rRollback() is c
19e00 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
19e10 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
19e20 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
19e30 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67     *  sqlite3Pag
19e40 65 72 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c  erUnref() is cal
19e50 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20  led to on every 
19e60 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
19e70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
19e80 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74  t parameter to t
19e90 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
19ea0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20   pointer to any 
19eb0 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65  open page of the
19ec0 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
19ed0 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e  e.  Nothing chan
19ee0 67 65 73 20 61 62 6f 75 74 20 74 68 65 20 70 61  ges about the pa
19ef0 67 65 20 2d 20 69 74 20 69 73 20 75 73 65 64 20  ge - it is used 
19f00 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71  merely to.** acq
19f10 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74  uire a pointer t
19f20 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
19f30 63 74 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f  cture and as pro
19f40 6f 66 20 74 68 61 74 20 74 68 65 72 65 20 69 73  of that there is
19f50 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65  .** already a re
19f60 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad-lock on the d
19f70 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54  atabase..**.** T
19f80 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65  he second parame
19f90 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f  ter indicates ho
19fa0 77 20 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20  w much space in 
19fb0 62 79 74 65 73 20 74 6f 20 72 65 73 65 72 76 65  bytes to reserve
19fc0 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72   for a.** master
19fd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61   journal file-na
19fe0 6d 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  me at the start 
19ff0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  of the journal w
1a000 68 65 6e 20 69 74 20 69 73 20 63 72 65 61 74 65  hen it is create
1a010 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e  d..**.** A journ
1a020 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65  al file is opene
1a030 64 20 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74  d if this is not
1a040 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
1a050 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  e.  For temporar
1a060 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20  y.** files, the 
1a070 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a  opening of the j
1a080 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64  ournal file is d
1a090 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68  eferred until th
1a0a0 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74  ere is an.** act
1a0b0 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74  ual need to writ
1a0c0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
1a0d0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64  ..**.** If the d
1a0e0 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
1a0f0 64 79 20 72 65 73 65 72 76 65 64 20 66 6f 72 20  dy reserved for 
1a100 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f  writing, this ro
1a110 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
1a120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61  ..**.** If exFla
1a130 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68  g is true, go ah
1a140 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45  ead and get an E
1a150 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
1a160 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d   the file.** imm
1a170 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64  ediately instead
1a180 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69   of waiting unti
1a190 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73  l we try to flus
1a1a0 68 20 74 68 65 20 63 61 63 68 65 2e 20 20 54 68  h the cache.  Th
1a1b0 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69  e.** exFlag is i
1a1c0 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e  gnored if a tran
1a1d0 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
1a1e0 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e  dy active..*/.in
1a1f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  t sqlite3PagerBe
1a200 67 69 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c  gin(DbPage *pPg,
1a210 20 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20   int exFlag){.  
1a220 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
1a230 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
1a240 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a250 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
1a260 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
1a270 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a280 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1a290 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
1a2a0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1a2b0 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
1a2c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1a2d0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
1a2e0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1a2f0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
1a300 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
1a310 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
1a320 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1a330 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1a340 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1a360 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
1a370 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
1a380 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1a390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1a3a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
1a3b0 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
1a3c0 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
1a3d0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
1a3e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1a3f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1a400 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
1a410 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
1a420 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1a430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a440 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1a450 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1a460 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1a470 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
1a480 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 54    PAGERTRACE2("T
1a490 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
1a4a0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1a4b0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
1a4c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1a4d0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
1a4e0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
1a4f0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
1a500 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
1a510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1a520 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
1a530 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a540 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
1a550 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
1a560 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
1a570 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
1a580 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
1a590 61 63 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74  access mode last
1a5a0 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28  .    ** time a (
1a5b0 72 65 61 64 20 6f 72 20 77 72 69 74 65 29 20 74  read or write) t
1a5c0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
1a5d0 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63  uccessfully conc
1a5e0 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20  luded.    ** by 
1a5f0 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  this connection.
1a600 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65   Instead of dele
1a610 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
1a620 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20   file it was .  
1a630 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61    ** kept open a
1a640 6e 64 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  nd truncated to 
1a650 30 20 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a  0 bytes..    */.
1a660 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a670 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20  er->nRec==0 );. 
1a680 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a690 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30  r->origDbSize==0
1a6a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1a6b0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a6c0 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  al==0 );.    sql
1a6d0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1a6e0 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  nt(pPager);.    
1a6f0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1a700 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  al = sqliteMallo
1a710 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
1a720 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20 20 69  e/8 + 1 );.    i
1a730 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
1a740 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
1a750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
1a760 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
1a770 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
1a780 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  DbSize = pPager-
1a790 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 72  >dbSize;.      r
1a7a0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1a7b0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1a7c0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1a7d0 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   !pPager->journa
1a7e0 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65 72 2d  lOpen || pPager-
1a7f0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
1a800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1a810 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1a820 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
1a830 61 67 65 20 64 69 72 74 79 2e 20 20 53 65 74 20  age dirty.  Set 
1a840 69 74 73 20 64 69 72 74 79 20 66 6c 61 67 20 61  its dirty flag a
1a850 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74 68 65  nd add it to the
1a860 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65 20 6c   dirty.** page l
1a870 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
1a880 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28 50 67  oid makeDirty(Pg
1a890 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
1a8a0 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
1a8b0 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
1a8c0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
1a8d0 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  r;.    pPg->dirt
1a8e0 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
1a8f0 70 44 69 72 74 79 20 3d 20 70 50 61 67 65 72 2d  pDirty = pPager-
1a900 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69 66 28  >pDirty;.    if(
1a910 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
1a920 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1a930 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69  >pDirty->pPrevDi
1a940 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rty = pPg;.    }
1a950 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44  .    pPg->pPrevD
1a960 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  irty = 0;.    pP
1a970 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
1a980 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pg;.  }.}../*.**
1a990 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63 6c 65   Make a page cle
1a9a0 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73 20 64  an.  Clear its d
1a9b0 69 72 74 79 20 62 69 74 20 61 6e 64 20 72 65 6d  irty bit and rem
1a9c0 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 0a  ove it from the.
1a9d0 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20 6c 69  ** dirty page li
1a9e0 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  st..*/.static vo
1a9f0 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48  id makeClean(PgH
1aa00 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
1aa10 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
1aa20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
1aa30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
1aa40 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70  Dirty ){.      p
1aa50 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
1aa60 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50  vDirty = pPg->pP
1aa70 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  revDirty;.    }.
1aa80 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
1aa90 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  evDirty ){.     
1aaa0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
1aab0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e  ->pDirty = pPg->
1aac0 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73  pDirty;.    }els
1aad0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
1aae0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70  ager->pDirty = p
1aaf0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
1ab00 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  }.  }.}.../*.** 
1ab10 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65  Mark a data page
1ab20 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20   as writeable.  
1ab30 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74  The page is writ
1ab40 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
1ab50 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69  rnal .** if it i
1ab60 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
1ab70 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ady.  This routi
1ab80 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65  ne must be calle
1ab90 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a  d before making.
1aba0 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20  ** changes to a 
1abb0 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
1abc0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
1abd0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1abe0 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65  d, the pager cre
1abf0 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f  ates a new.** jo
1ac00 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72  urnal and acquir
1ac10 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  es a RESERVED lo
1ac20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1ac30 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45  se.  If the RESE
1ac40 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75  RVED.** lock cou
1ac50 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72  ld not be acquir
1ac60 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ed, this routine
1ac70 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1ac80 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61  BUSY.  The.** ca
1ac90 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75  lling routine mu
1aca0 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61  st check for tha
1acb0 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61  t return value a
1acc0 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f  nd be careful no
1acd0 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61  t to.** change a
1ace0 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74  ny page data unt
1acf0 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  il this routine 
1ad00 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f  returns SQLITE_O
1ad10 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
1ad20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75  journal file cou
1ad30 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65  ld not be writte
1ad40 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69  n because the di
1ad50 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74  sk is full,.** t
1ad60 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1ad70 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1ad80 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e  FULL and does an
1ad90 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62   immediate rollb
1ada0 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73  ack..** All subs
1adb0 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74  equent write att
1adc0 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72  empts also retur
1add0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e  n SQLITE_FULL un
1ade0 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20  til there.** is 
1adf0 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  a call to sqlite
1ae00 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f  3PagerCommit() o
1ae10 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  r sqlite3PagerRo
1ae20 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72  llback() to.** r
1ae30 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
1ae40 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 28  int pager_write(
1ae50 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76  PgHdr *pPg){.  v
1ae60 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48  oid *pData = PGH
1ae70 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
1ae80 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1ae90 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1aea0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1aeb0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  E_OK;..  /* Chec
1aec0 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a  k for errors.  *
1aed0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1aee0 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20  errCode ){ .    
1aef0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
1af00 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66  rrCode;.  }.  if
1af10 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
1af20 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
1af30 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
1af40 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
1af50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1af60 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45  );..  CHECK_PAGE
1af70 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  (pPg);..  /* Mar
1af80 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
1af90 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
1afa0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
1afb0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
1afc0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
1afd0 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
1afe0 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
1aff0 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  */.  makeDirty(p
1b000 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
1b010 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
1b020 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
1b030 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
1b040 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
1b050 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1b060 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
1b070 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
1b080 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
1b090 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
1b0a0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
1b0b0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1b0c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
1b0d0 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
1b0e0 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
1b0f0 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
1b100 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
1b110 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
1b120 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
1b130 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
1b140 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
1b150 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
1b160 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
1b170 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b180 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1b190 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
1b1a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
1b1b0 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
1b1c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b1d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
1b1e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
1b1f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b200 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1b210 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
1b220 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
1b230 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
1b240 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
1b250 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1b260 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
1b270 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1b280 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b290 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1b2a0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
1b2b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1b2c0 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
1b2d0 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
1b2e0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1b2f0 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
1b300 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1b310 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
1b320 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
1b330 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
1b340 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
1b350 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1b360 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
1b370 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
1b380 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
1b390 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
1b3a0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
1b3b0 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
1b3c0 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
1b3d0 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
1b3e0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
1b3f0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1b400 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
1b410 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
1b420 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
1b430 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
1b440 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b         int szPg;
1b450 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d  .        if( MEM
1b460 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
1b470 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1b480 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1b490 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1b4a0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52           PAGERTR
1b4b0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
1b4c0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
1b4d0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1b4e0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1b4f0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
1b500 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
1b510 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
1b520 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
1b530 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
1b540 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
1b550 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
1b560 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
1b570 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
1b580 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
1b590 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1b5a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b5b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
1b5c0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1b5d0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
1b5e0 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  m, saved;.      
1b5f0 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1b600 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20 20 20 20  , *pEnd;.       
1b610 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
1b620 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
1b630 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1b640 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
1b650 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
1b660 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
1b670 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
1b680 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
1b690 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
1b6a0 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
1b6b0 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
1b6c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
1b6d0 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
1b6e0 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
1b6f0 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
1b700 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
1b710 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
1b720 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
1b730 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
1b740 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
1b750 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
1b760 20 20 20 70 45 6e 64 20 3d 20 70 44 61 74 61 32     pEnd = pData2
1b770 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
1b780 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ize;.          p
1b790 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20 20 20 20  Data2 -= 4;.    
1b7a0 20 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28        saved = *(
1b7b0 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20 20 20 20  u32*)pEnd;.     
1b7c0 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70       put32bits(p
1b7d0 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  End, cksum);.   
1b7e0 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70 50         szPg = pP
1b7f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
1b800 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33  ;.          put3
1b810 32 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50  2bits(pData2, pP
1b820 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
1b830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b840 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
1b850 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 73 7a 50  jfd, pData2, szP
1b860 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  g);.          IO
1b870 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70 20  TRACE(("JOUT %p 
1b880 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %d %lld %d\n", p
1b890 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
1b8a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b8b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1b8c0 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67 29 29 0a  rnalOff, szPg)).
1b8d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1b8e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
1b8f0 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
1b900 50 41 47 45 52 54 52 41 43 45 34 28 22 4a 4f 55  PAGERTRACE4("JOU
1b910 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
1b920 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
1b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b940 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1b950 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1b960 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
1b970 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 70          *(u32*)p
1b980 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a 0a 09 20  End = saved;... 
1b990 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
1b9a0 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
1b9b0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1b9c0 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
1b9d0 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
1b9e0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
1b9f0 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
1ba00 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
1ba10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1ba20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1ba30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1ba40 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ba50 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
1ba60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
1ba70 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
1ba80 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ba90 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  aInJournal!=0 );
1baa0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
1bab0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
1bac0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1bad0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1bae0 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e            pPg->n
1baf0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
1bb00 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
1bb10 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1bb20 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1bb30 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
1bb40 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
1bb50 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
1bb60 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
1bb70 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64          page_add
1bb80 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
1bb90 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
1bba0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bbb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
1bbc0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
1bbd0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
1bbe0 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
1bbf0 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
1bc00 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
1bc10 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
1bc20 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
1bc30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1bc40 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1bc50 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
1bc60 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
1bc70 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1bc80 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1bc90 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1bca0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1bcb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
1bcc0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1bcd0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
1bce0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
1bcf0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
1bd00 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
1bd10 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
1bd20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
1bd30 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1bd40 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
1bd50 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
1bd60 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
1bd70 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1bd80 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
1bd90 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
1bda0 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
1bdb0 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
1bdc0 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
1bdd0 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
1bde0 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
1bdf0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1be00 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
1be10 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
1be20 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
1be30 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
1be40 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1be50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
1be60 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
1be70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1be80 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  e );.      if( M
1be90 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
1bea0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1beb0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1bec0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1bed0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1bee0 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  Hist->pStmt==0 )
1bef0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
1bf00 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  >pStmt = sqliteM
1bf10 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
1bf20 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
1bf30 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1bf40 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
1bf50 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
1bf60 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
1bf70 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
1bf80 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1bf90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bfa0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53    PAGERTRACE3("S
1bfb0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
1bfc0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
1bfd0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
1bfe0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  >pgno);.      }e
1bff0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61  lse{.        cha
1c000 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
1c010 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c020 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 2d  , pPg->pgno, 7)-
1c030 34 3b 0a 20 20 20 20 20 20 20 20 70 75 74 33 32  4;.        put32
1c040 62 69 74 73 28 70 44 61 74 61 32 2c 20 70 50 67  bits(pData2, pPg
1c050 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
1c060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
1c070 72 69 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  rite(pPager->stf
1c080 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
1c090 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a  r->pageSize+4);.
1c0a0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1c0b0 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
1c0c0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1c0d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c0e0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1c0f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1c100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1c110 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1c120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1c130 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1c140 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
1c150 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
1c160 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
1c170 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1c180 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1c190 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1c1a0 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o&7);.      }.  
1c1b0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1c1c0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1c1d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1c1e0 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  Update the datab
1c1f0 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65 74  ase size and ret
1c200 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  urn..  */.  asse
1c210 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1c220 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
1c230 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1c240 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
1c250 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
1c260 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1c270 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
1c280 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
1c290 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
1c2a0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
1c2b0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
1c2c0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
1c2d0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
1c2e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1c2f0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1c300 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  on is used to ma
1c310 72 6b 20 61 20 64 61 74 61 2d 70 61 67 65 20 61  rk a data-page a
1c320 73 20 77 72 69 74 61 62 6c 65 2e 20 49 74 20 75  s writable. It u
1c330 73 65 73 20 0a 2a 2a 20 70 61 67 65 72 5f 77 72  ses .** pager_wr
1c340 69 74 65 28 29 20 74 6f 20 6f 70 65 6e 20 61 20  ite() to open a 
1c350 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66  journal file (if
1c360 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61   it is not alrea
1c370 64 79 20 6f 70 65 6e 29 0a 2a 2a 20 61 6e 64 20  dy open).** and 
1c380 77 72 69 74 65 20 74 68 65 20 70 61 67 65 20 2a  write the page *
1c390 70 44 61 74 61 20 74 6f 20 74 68 65 20 6a 6f 75  pData to the jou
1c3a0 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
1c3b0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
1c3c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1c3d0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
1c3e0 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
1c3f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
1c400 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
1c410 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
1c420 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
1c430 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
1c440 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
1c450 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
1c460 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
1c470 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
1c480 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1c490 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1c4a0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
1c4b0 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ning..*/.int sql
1c4c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
1c4d0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
1c4e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c4f0 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
1c500 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
1c510 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
1c520 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
1c530 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
1c540 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
1c550 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
1c560 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
1c570 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
1c580 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
1c590 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
1c5a0 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
1c5b0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
1c5c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
1c5d0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1c5e0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
1c5f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1c600 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
1c610 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
1c620 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
1c630 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
1c640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1c650 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
1c660 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
1c670 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
1c680 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20 2f 2a   int ii;..    /*
1c690 20 53 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79   Set the doNotSy
1c6a0 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68  nc flag to 1. Th
1c6b0 69 73 20 69 73 20 62 65 63 61 75 73 65 20 77 65  is is because we
1c6c0 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20   cannot allow a 
1c6d0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68  journal.    ** h
1c6e0 65 61 64 65 72 20 74 6f 20 62 65 20 77 72 69 74  eader to be writ
1c6f0 74 65 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20  ten between the 
1c700 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20  pages journaled 
1c710 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
1c720 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
1c730 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1c740 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  otSync==0 );.   
1c750 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1c760 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 1;..    /* 
1c770 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75 6d  This trick assum
1c780 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68 65  es that both the
1c790 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
1c7a0 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a 20  ector-size are. 
1c7b0 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72     ** an integer
1c7c0 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74 20   power of 2. It 
1c7d0 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70 67  sets variable pg
1c7e0 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69 66  1 to the identif
1c7f0 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ier.    ** of th
1c800 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
1c810 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69  the sector pPg i
1c820 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20 20  s located on..  
1c830 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20 28    */.    pg1 = (
1c840 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26 20  (pPg->pgno-1) & 
1c850 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  ~(nPagePerSector
1c860 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20 6e  -1)) + 1;..    n
1c870 50 61 67 65 43 6f 75 6e 74 20 3d 20 73 71 6c 69  PageCount = sqli
1c880 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1c890 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1c8a0 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50 61  f( pPg->pgno>nPa
1c8b0 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  geCount ){.     
1c8c0 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e 70   nPage = (pPg->p
1c8d0 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20 20  gno - pg1)+1;.  
1c8e0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67 31    }else if( (pg1
1c8f0 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 2d  +nPagePerSector-
1c900 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  1)>nPageCount ){
1c910 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
1c920 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31 3b  PageCount+1-pg1;
1c930 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c940 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 50    nPage = nPageP
1c950 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d 0a  erSector;.    }.
1c960 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67 65      assert(nPage
1c970 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  >0);.    assert(
1c980 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29 3b  pg1<=pPg->pgno);
1c990 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67 31  .    assert((pg1
1c9a0 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67 6e  +nPage)>pPg->pgn
1c9b0 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d  o);..    for(ii=
1c9c0 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 72  0; ii<nPage && r
1c9d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 69  c==SQLITE_OK; ii
1c9e0 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  ++){.      Pgno 
1c9f0 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20 20  pg = pg1+ii;.   
1ca00 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1ca10 61 49 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 70 67  aInJournal || pg
1ca20 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a  ==pPg->pgno || .
1ca30 20 20 20 20 20 20 20 20 20 20 70 67 3e 70 50 61            pg>pPa
1ca40 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1ca50 7c 7c 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e  || !(pPager->aIn
1ca60 4a 6f 75 72 6e 61 6c 5b 70 67 2f 38 5d 26 28 31  Journal[pg/8]&(1
1ca70 3c 3c 28 70 67 26 37 29 29 29 0a 20 20 20 20 20  <<(pg&7))).     
1ca80 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   ) {.        if(
1ca90 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
1caa0 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
1cab0 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
1cac0 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Page;.          
1cad0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1cae0 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
1caf0 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
1cb00 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1cb10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1cb20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1cb30 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1cb40 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1cb50 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
1cb60 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
1cb70 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cb80 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73 73  }.    }..    ass
1cb90 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e  ert( pPager->doN
1cba0 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20 20  otSync==1 );.   
1cbb0 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79   pPager->doNotSy
1cbc0 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  nc = 0;.  }else{
1cbd0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1cbe0 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  write(pDbPage);.
1cbf0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1cc00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cc10 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67   TRUE if the pag
1cc20 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61  e given in the a
1cc30 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76  rgument was prev
1cc40 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a  iously passed.**
1cc50 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1cc60 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  Write().  In oth
1cc70 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
1cc80 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
1cc90 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
1cca0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
1ccb0 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64  e page..*/.#ifnd
1ccc0 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73 71  ef NDEBUG.int sq
1ccd0 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
1cce0 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70 50  eable(DbPage *pP
1ccf0 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  g){.  return pPg
1cd00 2d 3e 64 69 72 74 79 3b 0a 7d 0a 23 65 6e 64 69  ->dirty;.}.#endi
1cd10 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1cd20 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
1cd30 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
1cd40 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
1cd50 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
1cd60 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
1cd70 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
1cd80 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
1cd90 71 6c 69 74 65 33 50 61 67 65 72 4f 76 65 72 77  qlite3PagerOverw
1cda0 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
1cdb0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
1cdc0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
1cdd0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
1cde0 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
1cdf0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
1ce00 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29  ger, pgno, &pPg)
1ce10 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
1ce20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
1ce30 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1ce40 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ite(pPg);.    if
1ce50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ce60 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1ce70 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
1ce80 61 74 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c  ata(pPg), pData,
1ce90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1cea0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
1ceb0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
1cec0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pPg);.  }.  retu
1ced0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
1cee0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
1cef0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
1cf00 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
1cf10 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
1cf20 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
1cf30 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
1cf40 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f  on on page "pgno
1cf50 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69  " back to the di
1cf60 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a  sk, even though.
1cf70 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69 67  ** that page mig
1cf80 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ht be marked as 
1cf90 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dirty..**.** The
1cfa0 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77   overlying softw
1cfb0 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20  are layer calls 
1cfc0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
1cfd0 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74  n all of the dat
1cfe0 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65  a.** on the give
1cff0 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65 64  n page is unused
1d000 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61 72  .  The pager mar
1d010 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20 63  ks the page as c
1d020 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20  lean so.** that 
1d030 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20  it does not get 
1d040 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
1d050 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f  .**.** Tests sho
1d060 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74 69  w that this opti
1d070 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68  mization, togeth
1d080 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73  er with the.** s
1d090 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1d0a0 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
1d0b0 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
1d0c0 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
1d0d0 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
1d0e0 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
1d0f0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
1d100 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
1d110 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
1d120 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1d130 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
1d140 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
1d150 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
1d160 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1d170 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  to sqlite3PagerD
1d180 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
1d190 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
1d1a0 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
1d1b0 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
1d1c0 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
1d1d0 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
1d1e0 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
1d1f0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
1d200 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
1d210 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
1d220 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
1d230 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
1d240 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1d250 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
1d260 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
1d270 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
1d280 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
1d290 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
1d2a0 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
1d2b0 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
1d2c0 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
1d2d0 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
1d2e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1d2f0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
1d300 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  * the sqlite3Pag
1d310 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1d320 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1d330 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
1d340 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e   the.** page con
1d350 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c 20 64  tains critical d
1d360 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
1d370 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
1d380 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65 64 20   gets.** rolled 
1d390 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20 6f 66  back in spite of
1d3a0 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
1d3b0 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1d3c0 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  call..*/.void sq
1d3d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
1d3e0 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ite(Pager *pPage
1d3f0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
1d400 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1d410 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75  if( MEMDB ) retu
1d420 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67  rn;..  pPg = pag
1d430 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1d440 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
1d450 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f 2a  t( pPg!=0 );  /*
1d460 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20 5f   We never call _
1d470 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65 73  dont_write unles
1d480 73 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e  s the page is in
1d490 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e 61   mem */.  pPg->a
1d4a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1d4b0 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
1d4c0 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
1d4d0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1d4e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d4f0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1d500 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1d510 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1d520 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1d530 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1d540 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1d550 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1d560 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1d570 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1d580 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1d590 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1d5a0 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1d5b0 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1d5c0 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1d5d0 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1d5e0 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1d5f0 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1d600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1d610 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1d620 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1d630 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1d640 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1d650 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1d660 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1d670 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1d680 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1d690 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1d6a0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1d6b0 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1d6c0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1d6d0 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1d6e0 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1d6f0 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1d700 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1d710 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1d720 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1d730 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1d740 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1d750 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d760 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1d770 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
1d780 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f  d of %d\n", pgno
1d790 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d7a0 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  ));.      IOTRAC
1d7b0 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c  E(("CLEAN %p %d\
1d7c0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
1d7d0 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  )).      makeCle
1d7e0 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20  an(pPg);.#ifdef 
1d7f0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1d800 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  ES.      pPg->pa
1d810 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
1d820 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
1d830 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
1d840 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
1d850 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
1d860 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
1d870 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63  hat if a rollbac
1d880 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20  k occurs,.** it 
1d890 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
1d8a0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1d8b0 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65  data on the give
1d8c0 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a  n page.  This.**
1d8d0 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1d8e0 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68  pager does not h
1d8f0 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68  ave to record th
1d900 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20  e given page in 
1d910 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  the.** rollback 
1d920 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64  journal..*/.void
1d930 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1d940 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65  tRollback(DbPage
1d950 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
1d960 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1d970 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74  Pager;..  assert
1d980 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1d990 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
1d9a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
1d9b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1d9c0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
1d9d0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
1d9e0 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
1d9f0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c  lwaysRollback ||
1da00 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b   MEMDB ) return;
1da10 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a  .  if( !pPg->inJ
1da20 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70  ournal && (int)p
1da30 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1da40 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1da50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1da60 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1da70 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  !=0 );.    pPage
1da80 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50  r->aInJournal[pP
1da90 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
1daa0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
1dab0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1dac0 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  al = 1;.    if( 
1dad0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1dae0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
1daf0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1db00 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1db10 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1db20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
1db30 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
1db40 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54 52     }.    PAGERTR
1db50 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
1db60 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
1db70 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
1db80 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1db90 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
1dba0 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e  "GARBAGE %p %d\n
1dbb0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
1dbc0 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66 28  pgno)).  }.  if(
1dbd0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1dbe0 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
1dbf0 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
1dc00 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
1dc10 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
1dc20 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
1dc30 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
1dc40 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
1dc50 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
1dc60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1dc70 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
1dc80 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1dc90 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
1dca0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
1dcb0 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
1dcc0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
1dcd0 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  Pg);.  }.}.../*.
1dce0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1dcf0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63  is called to inc
1dd00 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61 62  rement the datab
1dd10 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 2d  ase file change-
1dd20 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72  counter,.** stor
1dd30 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f 66  ed at byte 24 of
1dd40 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e   the pager file.
1dd50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1dd60 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
1dd70 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a 70  counter(Pager *p
1dd80 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
1dd90 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
1dda0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
1ddb0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1ddc0 21 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43  !pPager->changeC
1ddd0 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20  ountDone ){.    
1dde0 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
1ddf0 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
1de00 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
1de10 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1de20 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
1de30 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
1de40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1de50 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1de60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1de70 72 57 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a  rWrite(pPgHdr);.
1de80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1de90 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1dea0 63 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 61  c;.  .    /* Rea
1deb0 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  d the current va
1dec0 6c 75 65 20 61 74 20 62 79 74 65 20 32 34 2e 20  lue at byte 24. 
1ded0 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f  */.    change_co
1dee0 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76 65  unter = retrieve
1def0 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20 32  32bits(pPgHdr, 2
1df00 34 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 6e  4);.  .    /* In
1df10 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
1df20 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
1df30 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
1df40 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1df50 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1df60 2b 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  +;.    put32bits
1df70 28 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54  (((char*)PGHDR_T
1df80 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b  O_DATA(pPgHdr))+
1df90 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  24, change_count
1dfa0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
1dfb0 3e 69 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20  >iChangeCount = 
1dfc0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a  change_counter;.
1dfd0 20 20 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73    .    /* Releas
1dfe0 65 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72  e the page refer
1dff0 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ence. */.    sql
1e000 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1e010 50 67 48 64 72 29 3b 0a 20 20 20 20 70 50 61 67  PgHdr);.    pPag
1e020 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
1e030 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  one = 1;.  }.  r
1e040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
1e060 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1e070 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70   for the pager p
1e080 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70  Pager. zMaster p
1e090 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d  oints to the nam
1e0a0 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72  e.** of a master
1e0b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
1e0c0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
1e0d0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e  tten into the in
1e0e0 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72  dividual.** jour
1e0f0 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65  nal file. zMaste
1e100 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77  r may be NULL, w
1e110 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65  hich is interpre
1e120 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72  ted as no master
1e130 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73  .** journal (a s
1e140 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74  ingle database t
1e150 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
1e160 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e170 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65  ensures that the
1e180 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
1e190 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ed, all dirty pa
1e1a0 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74  ges written.** t
1e1b0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1e1c0 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61  ile and the data
1e1d0 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64  base file synced
1e1e0 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67  . The only thing
1e1f0 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73   that.** remains
1e200 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74   to commit the t
1e210 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f  ransaction is to
1e220 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1e230 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20  nal file (or.** 
1e240 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1e250 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64  ile if specified
1e260 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  )..**.** Note th
1e270 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e  at if zMaster==N
1e280 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e  ULL, this does n
1e290 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70  ot overwrite a p
1e2a0 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a  revious value.**
1e2b0 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71   passed to an sq
1e2c0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
1e2d0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 2e  PhaseOne() call.
1e2e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1e2f0 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
1e300 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1e310 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
1e320 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
1e330 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
1e340 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
1e350 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1e360 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es)..*/.int sqli
1e370 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
1e380 61 73 65 4f 6e 65 28 50 61 67 65 72 20 2a 70 50  aseOne(Pager *pP
1e390 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
1e3a0 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20   *zMaster, Pgno 
1e3b0 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72  nTrunc){.  int r
1e3c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1e3d0 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44    PAGERTRACE4("D
1e3e0 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
1e3f0 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
1e400 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
1e410 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
1e420 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
1e430 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a  , nTrunc);..  /*
1e440 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1e450 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
1e460 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
1e470 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
1e480 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
1e490 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1e4a0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
1e4b0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1e4c0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1e4d0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
1e4e0 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
1e4f0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1e500 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
1e510 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
1e520 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1e530 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
1e540 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1e550 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1e560 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1e570 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1e580 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1e590 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1e5a0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1e5b0 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1e5c0 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1e5d0 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1e5e0 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1e5f0 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1e600 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1e610 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1e620 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1e630 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1e640 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1e650 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1e660 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1e670 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1e680 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1e690 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1e6a0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1e6b0 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1e6c0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1e6d0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1e6e0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1e6f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1e700 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1e710 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e720 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1e730 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
1e740 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1e750 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
1e760 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
1e770 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
1e780 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
1e790 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
1e7a0 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
1e7b0 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
1e7c0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
1e7d0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
1e7e0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
1e7f0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1e800 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1e810 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50     int iSkip = P
1e820 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
1e830 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ger);.        fo
1e840 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
1e850 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1e860 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
1e870 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50 61         if( !(pPa
1e880 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
1e890 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37 29  i/8] & (1<<(i&7)
1e8a0 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29  )) && i!=iSkip )
1e8b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1e8c0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
1e8d0 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1e8e0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Pg);.           
1e8f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1e900 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1e910 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xit;.           
1e920 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e930 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20  erWrite(pPg);.  
1e940 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e950 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
1e960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1e970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e980 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1e990 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e9a0 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
1e9b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63  .#endif.      rc
1e9c0 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
1e9d0 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
1e9e0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66  aster);.      if
1e9f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ea00 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1ea10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e  ;.      rc = syn
1ea20 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
1ea30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1ea40 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1ea50 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1ea60 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
1ea70 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1ea80 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
1ea90 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
1eaa0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
1eab0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
1eac0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
1ead0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1eae0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1eaf0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1eb00 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
1eb10 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1eb20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1eb30 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
1eb40 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
1eb50 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
1eb60 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1eb70 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1eb80 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1eb90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1eba0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1ebb0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
1ebc0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 53 79   = 0;..    /* Sy
1ebd0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1ebe0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1ebf0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1ec00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ec10 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61  qlite3OsSync(pPa
1ec20 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20  ger->fd, 0);.   
1ec30 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
1ec40 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
1ec50 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
1ec60 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1ec70 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c  ER_SYNCED;.  }el
1ec80 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  se if( MEMDB && 
1ec90 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1eca0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1ecb0 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
1ecc0 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
1ecd0 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
1ece0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
1ecf0 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
1ed00 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
1ed10 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
1ed20 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
1ed30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1ed40 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
1ed50 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
1ed60 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
1ed70 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
1ed80 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
1ed90 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
1eda0 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
1edb0 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
1edc0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
1edd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1ede0 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67 65  mitPhaseTwo(Page
1edf0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1ee00 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70  t rc;.  PgHdr *p
1ee10 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  Pg;..  if( pPage
1ee20 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1ee30 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1ee40 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
1ee50 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1ee60 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
1ee70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1ee80 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1ee90 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
1eea0 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
1eeb0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1eec0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1eed0 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
1eee0 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
1eef0 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
1ef00 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
1ef10 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
1ef20 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
1ef30 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
1ef40 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1ef50 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
1ef60 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
1ef70 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
1ef80 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1ef90 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1efa0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
1efb0 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
1efc0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1efd0 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
1efe0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
1eff0 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
1f000 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1f010 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
1f020 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
1f030 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
1f040 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
1f050 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1f060 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1f070 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
1f080 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
1f090 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
1f0a0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
1f0b0 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
1f0c0 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
1f0d0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
1f0e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
1f0f0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
1f100 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1f110 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
1f120 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f130 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1f140 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1f150 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
1f160 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1f170 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
1f180 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
1f190 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61  R_SYNCED || !pPa
1f1a0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1f1b0 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
1f1c0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
1f1d0 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
1f1e0 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1f1f0 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
1f200 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
1f210 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
1f220 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
1f230 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
1f240 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
1f250 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
1f260 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
1f270 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
1f280 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
1f290 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
1f2a0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
1f2b0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
1f2c0 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
1f2d0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
1f2e0 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
1f2f0 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
1f300 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
1f310 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
1f320 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
1f330 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
1f340 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
1f350 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
1f360 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
1f370 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
1f380 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
1f390 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
1f3a0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
1f3b0 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
1f3c0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
1f3d0 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
1f3e0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
1f3f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1f400 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
1f410 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
1f420 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
1f430 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
1f440 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
1f450 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
1f460 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1f470 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1f480 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
1f490 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
1f4a0 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
1f4b0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
1f4c0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
1f4d0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
1f4e0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
1f4f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
1f500 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
1f510 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
1f520 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
1f530 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
1f540 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
1f550 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
1f560 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
1f570 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
1f580 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
1f590 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
1f5a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
1f5b0 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
1f5c0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
1f5d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
1f5e0 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
1f5f0 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
1f600 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
1f610 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
1f620 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
1f630 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1f640 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
1f650 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
1f660 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1f670 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1f680 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
1f690 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45  AGERTRACE3("PAGE
1f6a0 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
1f6b0 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
1f6c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
1f6d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f6e0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
1f6f0 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
1f700 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
1f710 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
1f720 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74  .      p->inStmt
1f730 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70   = 0;.      p->p
1f740 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e  PrevStmt = p->pN
1f750 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1f760 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
1f770 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
1f780 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
1f790 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72 2d  niter(p, pPager-
1f7a0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1f7b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
1f7c0 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30  ager->pDirty = 0
1f7d0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
1f7e0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
1f7f0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
1f800 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1f810 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
1f820 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
1f830 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
1f840 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
1f850 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1f860 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
1f870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f880 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
1f890 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1f8a0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
1f8b0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
1f8c0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
1f8d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
1f8e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1f8f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
1f900 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
1f910 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
1f920 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
1f930 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1f940 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
1f950 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
1f960 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
1f970 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
1f980 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
1f990 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
1f9a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1f9b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
1f9c0 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
1f9d0 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  rc2;.    rc = pa
1f9e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
1f9f0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 72 63 32  ger, 0);.    rc2
1fa00 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
1fa10 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
1fa20 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1fa30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1fa40 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d   rc = rc2;.    }
1fa50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1fa60 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1fa70 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
1fa80 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  }.  pPager->dbSi
1fa90 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f 2a 20 49  ze = -1;..  /* I
1faa0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1fab0 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
1fac0 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
1fad0 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
1fae0 70 61 67 65 72 0a 20 20 2a 2a 20 63 61 63 68 65  pager.  ** cache
1faf0 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65 72 5f  . So call pager_
1fb00 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65 20 77  error() on the w
1fb10 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65 20 61  ay out to make a
1fb20 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 70  ny error .  ** p
1fb30 65 72 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a  ersistent..  */.
1fb40 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
1fb50 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1fb60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1fb70 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
1fb80 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
1fb90 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
1fba0 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
1fbb0 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1fbc0 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
1fbd0 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
1fbe0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  t sqlite3PagerIs
1fbf0 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20 2a  readonly(Pager *
1fc00 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1fc10 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  n pPager->readOn
1fc20 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ly;.}../*.** Ret
1fc30 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
1fc40 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
1fc50 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e  the pager..*/.in
1fc60 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
1fc70 66 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  fcount(Pager *pP
1fc80 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1fc90 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 7d 0a  pPager->nRef;.}.
1fca0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
1fcb0 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  EST./*.** This r
1fcc0 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
1fcd0 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
1fce0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f  nalysis only..*/
1fcf0 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61 67  .int *sqlite3Pag
1fd00 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a 70  erStats(Pager *p
1fd10 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63  Pager){.  static
1fd20 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b   int a[11];.  a[
1fd30 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  0] = pPager->nRe
1fd40 66 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67  f;.  a[1] = pPag
1fd50 65 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32  er->nPage;.  a[2
1fd60 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ] = pPager->mxPa
1fd70 67 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61  ge;.  a[3] = pPa
1fd80 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61  ger->dbSize;.  a
1fd90 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  [4] = pPager->st
1fda0 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50  ate;.  a[5] = pP
1fdb0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1fdc0 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[6] = pPager->
1fdd0 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70  nHit;.  a[7] = p
1fde0 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20  Pager->nMiss;.  
1fdf0 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[8] = pPager->n
1fe00 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70  Ovfl;.  a[9] = p
1fe10 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
1fe20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
1fe30 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
1fe40 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
1fe50 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74  .** Set the stat
1fe60 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70  ement rollback p
1fe70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  oint..**.** This
1fe80 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
1fe90 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  be called with t
1fea0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1feb0 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a  ournal already.*
1fec0 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73  * open.  A new s
1fed0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1fee0 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74   is created that
1fef0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1ff00 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e  rollback.** chan
1ff10 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ges of a single 
1ff20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68  SQL command with
1ff30 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e  in a larger tran
1ff40 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
1ff50 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
1ff60 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
1ff70 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1ff80 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1ff90 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
1ffa0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ffb0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1ffc0 48 41 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72  HARED );.  asser
1ffd0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
1ffe0 65 3e 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54  e>=0 );.  PAGERT
1fff0 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
20000 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
20010 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
20020 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
20030 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
20040 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
20050 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
20060 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
20070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20080 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
20090 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
200a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
200b0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
200c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
200d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
200e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
200f0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
20100 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
20110 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
20120 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
20130 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
20140 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
20150 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
20160 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
20170 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  fd, SHARED_LOCK)
20180 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  ; */.    return 
20190 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
201a0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
201b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
201c0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
201d0 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e  ->jfd, &pPager->
201e0 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
201f0 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
20200 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
20210 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20220 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50  >stmtJSize == pP
20230 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
20240 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61   );.#endif.  pPa
20250 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
20260 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
20270 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  Off;.  pPager->s
20280 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
20290 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67  ->dbSize;.  pPag
202a0 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
202b0 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
202c0 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72  mtCksum = pPager
202d0 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69  ->cksumInit;.  i
202e0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  f( !pPager->stmt
202f0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
20300 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
20310 6e 74 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73  ntemp(&pPager->s
20320 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
20330 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
20340 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
20350 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
20360 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
20370 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
20380 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
20390 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
203a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
203b0 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
203c0 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
203d0 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
203e0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
203f0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
20400 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
20410 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
20420 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
20430 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
20440 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
20450 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
20460 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
20470 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r){.  if( pPager
20480 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
20490 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a     PgHdr *pPg, *
204a0 70 4e 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52  pNext;.    PAGER
204b0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
204c0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
204d0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
204e0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
204f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
20500 65 6b 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ek(pPager->stfd,
20510 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71   0);.      /* sq
20520 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
20530 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
20540 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
20550 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61  eFree( pPager->a
20560 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20  InStmt );.      
20570 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
20580 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  = 0;.    }.    f
20590 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
205a0 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70  Stmt; pPg; pPg=p
205b0 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65  Next){.      pNe
205c0 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  xt = pPg->pNextS
205d0 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  tmt;.      asser
205e0 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  t( pPg->inStmt )
205f0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53  ;.      pPg->inS
20600 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
20610 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
20620 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  pPg->pNextStmt =
20630 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45   0;.      if( ME
20640 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50  MDB ){.        P
20650 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
20660 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
20670 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
20680 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
20690 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
206a0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
206b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
206c0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
206d0 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
206e0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
206f0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
20700 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
20710 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
20720 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
20730 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
20740 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20750 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74   Rollback a stat
20760 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
20770 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f  lite3PagerStmtRo
20780 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
20790 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
207a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
207b0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
207c0 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
207d0 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
207e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
207f0 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
20800 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
20810 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
20820 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
20830 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
20840 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
20850 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
20860 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
20870 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
20880 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
20890 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
208a0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
208b0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
208c0 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
208d0 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
208e0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
208f0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
20900 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
20910 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
20920 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
20930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
20940 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
20950 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
20960 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
20970 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
20980 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
20990 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
209a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
209b0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
209c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
209d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
209e0 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65 72  tmtCommit(pPager
209f0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20a00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20a10 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
20a20 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
20a30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20a40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
20a50 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
20a60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
20a70 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
20a80 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  ar *sqlite3Pager
20a90 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a  Filename(Pager *
20aa0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
20ab0 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  n pPager->zFilen
20ac0 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ame;.}../*.** Re
20ad0 74 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f  turn the directo
20ae0 72 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ry of the databa
20af0 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  se file..*/.cons
20b00 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
20b10 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61 67 65  agerDirname(Page
20b20 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
20b30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
20b40 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
20b50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
20b60 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
20b70 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
20b80 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
20b90 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
20ba0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
20bb0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
20bc0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
20bd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
20be0 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
20bf0 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
20c00 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
20c10 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
20c20 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
20c30 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
20c40 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
20c50 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
20c60 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
20c70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
20c80 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 2f  er->noSync;.}../
20c90 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64  *.** Set the cod
20ca0 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ec for this page
20cb0 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  r.*/.void sqlite
20cc0 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a  3PagerSetCodec(.
20cd0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
20ce0 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65  .  void *(*xCode
20cf0 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
20d00 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64  gno,int),.  void
20d10 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20   *pCodecArg.){. 
20d20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20   pPager->xCodec 
20d30 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67  = xCodec;.  pPag
20d40 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20  er->pCodecArg = 
20d50 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a 23 69  pCodecArg;.}..#i
20d60 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20d70 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
20d80 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
20d90 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
20da0 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Data to location
20db0 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
20dc0 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  e. .**.** There 
20dd0 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
20de0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72  ences to the cur
20df0 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20  rent page pgno. 
20e00 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a  If current page.
20e10 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  ** pgno is not a
20e20 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f  lready in the ro
20e30 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
20e40 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  it is not writte
20e50 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79  n there by.** by
20e60 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54   this routine. T
20e70 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20  he same applies 
20e80 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74  to the page pDat
20e90 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65  a refers to on e
20ea0 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20  ntry to.** this 
20eb0 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
20ec0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
20ed0 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f   page refered to
20ee0 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e   by pData remain
20ef0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
20f00 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
20f10 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
20f20 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e  h page pData (i.
20f30 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
20f40 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
20f50 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
20f60 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
20f70 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
20f80 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
20f90 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
20fa0 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
20fb0 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
20fc0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
20fd0 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65  s called. It use
20fe0 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69  d to be.** requi
20ff0 72 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65  red that a state
21000 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
21010 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c   was not active,
21020 20 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69   but this restri
21030 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65  ction.** has bee
21040 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54  n removed (CREAT
21050 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f  E INDEX needs to
21060 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65   move a page whe
21070 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  n a statement.**
21080 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21090 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20  active)..*/.int 
210a0 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65  sqlite3PagerMove
210b0 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
210c0 65 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c  er, DbPage *pPg,
210d0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
210e0 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20  gHdr *pPgOld; . 
210f0 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e   int h;.  Pgno n
21100 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b  eedSyncPgno = 0;
21110 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
21120 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41  >nRef>0 );..  PA
21130 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20  GERTRACE5("MOVE 
21140 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
21150 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
21160 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
21170 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
21180 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
21190 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
211a0 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
211b0 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
211c0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
211d0 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 69 66 28  o, pgno))..  if(
211e0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
211f0 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
21200 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
21210 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
21220 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
21230 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
21240 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65  irty );.    asse
21250 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
21260 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
21270 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
21280 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69  m it's hash-chai
21290 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
212a0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
212b0 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
212c0 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
212d0 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
212e0 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
212f0 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
21300 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
21310 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
21320 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
21330 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
21340 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
21350 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
21360 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
21370 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
21380 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
21390 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
213a0 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d  .  */.  pPgOld =
213b0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
213c0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
213d0 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
213e0 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
213f0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
21400 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
21410 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b  pPager, pPgOld);
21420 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
21430 50 67 4f 6c 64 29 3b 0a 20 20 20 20 69 66 28 20  PgOld);.    if( 
21440 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
21450 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21460 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72  ( pPgOld->inJour
21470 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67  nal );.      pPg
21480 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
21490 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
214a0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
214b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
214c0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
214d0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e  }.  }..  /* Chan
214e0 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
214f0 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
21500 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
21510 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
21520 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
21530 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
21540 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
21550 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
21560 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
21570 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
21580 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
21590 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
215a0 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
215b0 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
215c0 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
215d0 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
215e0 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
215f0 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
21600 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
21610 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
21620 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
21630 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
21640 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
21650 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
21660 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
21670 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
21680 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
21690 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
216a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
216b0 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
216c0 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
216d0 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
216e0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
216f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
21700 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
21710 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
21720 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
21730 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
21740 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
21750 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49  .    ** Pager.aI
21760 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
21770 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
21780 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
21790 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
217a0 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
217b0 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
217c0 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
217d0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
217e0 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
217f0 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
21800 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
21810 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
21820 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
21830 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
21840 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
21850 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
21860 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
21870 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
21880 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
21890 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
218a0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
218b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
218c0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
218d0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
218e0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
218f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21900 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21910 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
21920 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
21930 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
21940 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f      pPgHdr->inJo
21950 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d  urnal = 1;.    m
21960 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
21970 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
21980 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
21990 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
219a0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
219b0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
219c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
219d0 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20 73  e data for the s
219e0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
219f0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
21a00 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50 61  agerGetData(DbPa
21a10 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  ge *pPg){.  retu
21a20 72 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  rn PGHDR_TO_DATA
21a30 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  (pPg);.}../*.** 
21a40 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
21a50 20 74 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45   to the Pager.nE
21a60 78 74 72 61 20 62 79 74 65 73 20 6f 66 20 22 65  xtra bytes of "e
21a70 78 74 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20  xtra" space .** 
21a80 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
21a90 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69  with the specifi
21aa0 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64  ed page..*/.void
21ab0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47 65   *sqlite3PagerGe
21ac0 74 45 78 74 72 61 28 44 62 50 61 67 65 20 2a 70  tExtra(DbPage *p
21ad0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
21ae0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
21af0 65 72 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50  er;.  return (pP
21b00 61 67 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58  ager?PGHDR_TO_EX
21b10 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
21b20 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  :0);.}../*.** Ge
21b30 74 2f 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e  t/set the lockin
21b40 67 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20  g-mode for this 
21b50 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72  pager. Parameter
21b60 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f   eMode must be o
21b70 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c  ne.** of PAGER_L
21b80 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
21b90 2c 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  , PAGER_LOCKINGM
21ba0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a  ODE_NORMAL or .*
21bb0 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  * PAGER_LOCKINGM
21bc0 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49  ODE_EXCLUSIVE. I
21bd0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
21be0 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
21bf0 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69  hen.** the locki
21c00 6e 67 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74  ng-mode is set t
21c10 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65 63  o the value spec
21c20 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
21c30 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20   returned value 
21c40 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52 5f  is either PAGER_
21c50 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
21c60 41 4c 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c  AL or.** PAGER_L
21c70 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
21c80 53 49 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67  SIVE, indicating
21c90 20 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f   the current (po
21ca0 73 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a  ssibly updated).
21cb0 2a 2a 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e  ** locking-mode.
21cc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
21cd0 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  agerLockingMode(
21ce0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
21cf0 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73  nt eMode){.  ass
21d00 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45  ert( eMode==PAGE
21d10 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
21d20 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERY.            
21d30 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
21d40 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d  LOCKINGMODE_NORM
21d50 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  AL.            |
21d60 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  | eMode==PAGER_L
21d70 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
21d80 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
21d90 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
21da0 4f 44 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20  ODE_QUERY<0 );. 
21db0 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c   assert( PAGER_L
21dc0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41  OCKINGMODE_NORMA
21dd0 4c 3e 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f  L>=0 && PAGER_LO
21de0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
21df0 49 56 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  IVE>=0 );.  if( 
21e00 65 4d 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61  eMode>=0 && !pPa
21e10 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
21e20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63  .    pPager->exc
21e30 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f  lusiveMode = eMo
21e40 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
21e50 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78   (int)pPager->ex
21e60 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a  clusiveMode;.}..
21e70 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
21e80 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
21e90 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
21ea0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
21eb0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
21ec0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
21ed0 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
21ee0 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
21ef0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
21f00 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
21f10 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
21f20 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
21f30 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
21f40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
21f50 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
21f60 72 4c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72  rLockstate(Pager
21f70 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
21f80 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  urn sqlite3OsLoc
21f90 6b 53 74 61 74 65 28 70 50 61 67 65 72 2d 3e 66  kState(pPager->f
21fa0 64 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  d);.}.#endif..#i
21fb0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
21fc0 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20  G./*.** Print a 
21fd0 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72  listing of all r
21fe0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
21ff0 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f  and their ref co
22000 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  unt..*/.void sql
22010 69 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70  ite3PagerRefdump
22020 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22030 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
22040 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
22050 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
22060 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
22070 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
22080 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
22090 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
220a0 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33  gPrintf("PAGE %3
220b0 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
220c0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
220d0 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  g->pgno, PGHDR_T
220e0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
220f0 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23  ->nRef);.  }.}.#
22100 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a  endif..#endif /*
22110 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
22120 4b 49 4f 20 2a 2f 0a                             KIO */.