/ Hex Artifact Content
Login

Artifact f40ac7af27f3494e5c82807d09a7e23d741aaf75:


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 30  : pager.c,v 1.30
0350: 30 20 32 30 30 37 2f 30 33 2f 32 36 20 32 32 3a  0 2007/03/26 22:
0360: 30 35 3a 30 32 20 64 72 68 20 45 78 70 20 24 0a  05:02 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 74 68   is to remove th
0d50: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0d60: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0d70: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0d80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
0d90: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
0db0: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0dc0: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0dd0: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0de0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0df0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0e00: 74 65 33 50 61 67 65 72 47 65 74 28 29 20 6f 63  te3PagerGet() oc
0e10: 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65 20  curs, the state 
0e20: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50  transitions to P
0e30: 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20  AGER_SHARED..** 
0e40: 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20  After all pages 
0e50: 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73  have been releas
0e60: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f  ed using sqlite_
0e70: 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a  page_unref(),.**
0e80: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0e90: 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50  itions back to P
0ea0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0eb0: 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20  e first time.** 
0ec0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0ed0: 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
0ee0: 65 64 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  ed, the state tr
0ef0: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20  ansitions to.** 
0f00: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20  PAGER_RESERVED. 
0f10: 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69   (Note that sqli
0f20: 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28 29 20  te_page_write() 
0f30: 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63  can only be.** c
0f40: 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73  alled on an outs
0f50: 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69  tanding page whi
0f60: 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ch means that th
0f70: 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20  e pager must.** 
0f80: 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52  be in PAGER_SHAR
0f90: 45 44 20 62 65 66 6f 72 65 20 69 74 20 74 72 61  ED before it tra
0fa0: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0fb0: 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20  R_RESERVED.).** 
0fc0: 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74  The transition t
0fd0: 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  o PAGER_EXCLUSIV
0fe0: 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20 62 65  E occurs when be
0ff0: 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67 65 73  fore any changes
1000: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1010: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1020: 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c  e.  After an sql
1030: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1040: 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65  k().** or sqlite
1050: 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 2c  _pager_commit(),
1060: 20 74 68 65 20 73 74 61 74 65 20 67 6f 65 73 20   the state goes 
1070: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
1080: 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ARED..*/.#define
1090: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
10a0: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
10b0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
10c0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
10d0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
10e0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
10f0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1100: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1110: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1120: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1130: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1140: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1150: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1160: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1170: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c 49  *.** If the SQLI
1180: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1190: 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69 73 20 73  _LOCK macro is s
11a0: 65 74 20 74 6f 20 74 72 75 65 20 61 74 20 63 6f  et to true at co
11b0: 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a 2a 20 74  mpile-time,.** t
11c0: 68 65 6e 20 66 61 69 6c 65 64 20 61 74 74 65 6d  hen failed attem
11d0: 70 74 73 20 74 6f 20 67 65 74 20 61 20 72 65 73  pts to get a res
11e0: 65 72 76 65 64 20 6c 6f 63 6b 20 77 69 6c 6c 20  erved lock will 
11f0: 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  invoke the busy 
1200: 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 54 68 69  callback..** Thi
1210: 73 20 69 73 20 6f 66 66 20 62 79 20 64 65 66 61  s is off by defa
1220: 75 6c 74 2e 20 20 54 6f 20 73 65 65 20 77 68 79  ult.  To see why
1230: 2c 20 63 6f 6e 73 69 64 65 72 20 74 68 65 20 66  , consider the f
1240: 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69  ollowing scenari
1250: 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70 70 6f 73  o:.** .** Suppos
1260: 65 20 74 68 72 65 61 64 20 41 20 61 6c 72 65 61  e thread A alrea
1270: 64 79 20 68 61 73 20 61 20 73 68 61 72 65 64 20  dy has a shared 
1280: 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74 73 20 61  lock and wants a
1290: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 0a   reserved lock..
12a0: 2a 2a 20 54 68 72 65 61 64 20 42 20 61 6c 72 65  ** Thread B alre
12b0: 61 64 79 20 68 61 73 20 61 20 72 65 73 65 72 76  ady has a reserv
12c0: 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74  ed lock and want
12d0: 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
12e0: 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62 6f 74 68  ock.  If.** both
12f0: 20 74 68 72 65 61 64 73 20 61 72 65 20 75 73 69   threads are usi
1300: 6e 67 20 74 68 65 69 72 20 62 75 73 79 20 63 61  ng their busy ca
1310: 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d 69 67 68  llbacks, it migh
1320: 74 20 62 65 20 61 20 6c 6f 6e 67 20 74 69 6d 65  t be a long time
1330: 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e 65 20 6f  .** be for one o
1340: 66 20 74 68 65 20 74 68 72 65 61 64 73 20 67 69  f the threads gi
1350: 76 65 20 75 70 20 61 6e 64 20 61 6c 6c 6f 77 73  ve up and allows
1360: 20 74 68 65 20 6f 74 68 65 72 20 74 6f 20 70 72   the other to pr
1370: 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74 20 69 66  oceed..** But if
1380: 20 74 68 65 20 74 68 72 65 61 64 20 74 72 79 69   the thread tryi
1390: 6e 67 20 74 6f 20 67 65 74 20 74 68 65 20 72 65  ng to get the re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 67 69 76 65  served lock give
13b0: 73 20 75 70 20 71 75 69 63 6b 6c 79 0a 2a 2a 20  s up quickly.** 
13c0: 28 69 66 20 69 74 20 6e 65 76 65 72 20 69 6e 76  (if it never inv
13d0: 6f 6b 65 73 20 69 74 73 20 62 75 73 79 20 63 61  okes its busy ca
13e0: 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20 74 68 65  llback) then the
13f0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77 69 6c 6c   contention will
1400: 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76 65 64 20   be.** resolved 
1410: 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23 69 66 6e  quickly..*/.#ifn
1420: 64 65 66 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  def SQLITE_BUSY_
1430: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 23 20  RESERVED_LOCK.# 
1440: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 42 55  define SQLITE_BU
1450: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1460: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
1470: 20 54 68 69 73 20 6d 61 63 72 6f 20 72 6f 75 6e   This macro roun
1480: 64 73 20 76 61 6c 75 65 73 20 75 70 20 73 6f 20  ds values up so 
1490: 74 68 61 74 20 69 66 20 74 68 65 20 76 61 6c 75  that if the valu
14a0: 65 20 69 73 20 61 6e 20 61 64 64 72 65 73 73 20  e is an address 
14b0: 69 74 0a 2a 2a 20 69 73 20 67 75 61 72 61 6e 74  it.** is guarant
14c0: 65 65 64 20 74 6f 20 62 65 20 61 6e 20 61 64 64  eed to be an add
14d0: 72 65 73 73 20 74 68 61 74 20 69 73 20 61 6c 69  ress that is ali
14e0: 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d 62 79 74  gned to an 8-byt
14f0: 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 23  e boundary..*/.#
1500: 64 65 66 69 6e 65 20 46 4f 52 43 45 5f 41 4c 49  define FORCE_ALI
1510: 47 4e 4d 45 4e 54 28 58 29 20 20 20 28 28 28 58  GNMENT(X)   (((X
1520: 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a 2a 2a 20  )+7)&~7)../*.** 
1530: 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  Each in-memory i
1540: 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20 62  mage of a page b
1550: 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20 66  egins with the f
1560: 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72 2e  ollowing header.
1570: 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72 20  .** This header 
1580: 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65 20  is only visible 
1590: 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d 6f  to this pager mo
15a0: 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65 6e  dule.  The clien
15b0: 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20 63  t.** code that c
15c0: 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73 20  alls pager sees 
15d0: 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74 68  only the data th
15e0: 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20 68  at follows the h
15f0: 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c 69  eader..**.** Cli
1600: 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64 20  ent code should 
1610: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
1620: 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70 61  rWrite() on a pa
1630: 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b 69  ge prior to maki
1640: 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66 69  ng.** any modifi
1650: 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74 20  cations to that 
1660: 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73 74  page.  The first
1670: 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61 67   time sqlite3Pag
1680: 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73 20  erWrite().** is 
1690: 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69 67  called, the orig
16a0: 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e  inal page conten
16b0: 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  ts are written i
16c0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
16d0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
16e0: 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c 20  PgHdr.inJournal 
16f0: 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53 79  and PgHdr.needSy
1700: 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61 74  nc are set.  Lat
1710: 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  er, once.** the 
1720: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61 73  journal page has
1730: 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74 68   made it onto th
1740: 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c 20  e disk surface, 
1750: 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 2a  PgHdr.needSync.*
1760: 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20 54  * is cleared.  T
1770: 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67 65  he modified page
1780: 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74 74   cannot be writt
1790: 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  en back into the
17a0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74   original.** dat
17b0: 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
17c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
17d0: 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  es has been sync
17e0: 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20 74  ed to disk and t
17f0: 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65 64  he.** PgHdr.need
1800: 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63 6c  Sync has been cl
1810: 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eared..**.** The
1820: 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c 61   PgHdr.dirty fla
1830: 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73 71  g is set when sq
1840: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1850: 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64 0a  ) is called and.
1860: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61 67  ** is cleared ag
1870: 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61 67  ain when the pag
1880: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72 69  e content is wri
1890: 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68 65  tten back to the
18a0: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61 74   original.** dat
18b0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74  abase file..*/.t
18c0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
18d0: 48 64 72 20 50 67 48 64 72 3b 0a 73 74 72 75 63  Hdr PgHdr;.struc
18e0: 74 20 50 67 48 64 72 20 7b 0a 20 20 50 61 67 65  t PgHdr {.  Page
18f0: 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
1900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1910: 65 20 70 61 67 65 72 20 74 6f 20 77 68 69 63 68  e pager to which
1920: 20 74 68 69 73 20 70 61 67 65 20 62 65 6c 6f 6e   this page belon
1930: 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  gs */.  Pgno pgn
1940: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
1950: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1960: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ge number for th
1970: 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 48  is page */.  PgH
1980: 64 72 20 2a 70 4e 65 78 74 48 61 73 68 2c 20 2a  dr *pNextHash, *
1990: 70 50 72 65 76 48 61 73 68 3b 20 20 2f 2a 20 48  pPrevHash;  /* H
19a0: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
19b0: 61 69 6e 20 66 6f 72 20 50 67 48 64 72 2e 70 67  ain for PgHdr.pg
19c0: 6e 6f 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  no */.  PgHdr *p
19d0: 4e 65 78 74 46 72 65 65 2c 20 2a 70 50 72 65 76  NextFree, *pPrev
19e0: 46 72 65 65 3b 20 20 2f 2a 20 46 72 65 65 6c 69  Free;  /* Freeli
19f0: 73 74 20 6f 66 20 70 61 67 65 73 20 77 68 65 72  st of pages wher
1a00: 65 20 6e 52 65 66 3d 3d 30 20 2a 2f 0a 20 20 50  e nRef==0 */.  P
1a10: 67 48 64 72 20 2a 70 4e 65 78 74 41 6c 6c 3b 20  gHdr *pNextAll; 
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a30: 20 41 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70   A list of all p
1a40: 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20  ages */.  PgHdr 
1a50: 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72  *pNextStmt, *pPr
1a60: 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74  evStmt;  /* List
1a70: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
1a80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
1a90: 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 4a 6f 75  al */.  u8 inJou
1aa0: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
1ab0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
1ac0: 66 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74  f has been writt
1ad0: 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  en to journal */
1ae0: 0a 20 20 75 38 20 69 6e 53 74 6d 74 3b 20 20 20  .  u8 inStmt;   
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 2f 2a 20 54 52 55 45 20 69 66 20 69 6e 20    /* TRUE if in 
1b10: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
1b20: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38  bjournal */.  u8
1b30: 20 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20   dirty;         
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b50: 54 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20  TRUE if we need 
1b60: 74 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68  to write back ch
1b70: 61 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65  anges */.  u8 ne
1b80: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
1b90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e            /* Syn
1ba0: 63 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  c journal before
1bb0: 20 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61   writing this pa
1bc0: 67 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79  ge */.  u8 alway
1bd0: 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20  sRollback;      
1be0: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
1bf0: 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
1c00: 29 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20  ) for this page 
1c10: 2a 2f 0a 20 20 73 68 6f 72 74 20 69 6e 74 20 6e  */.  short int n
1c20: 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ref;            
1c30: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1c40: 20 75 73 65 72 73 20 6f 66 20 74 68 69 73 20 70   users of this p
1c50: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1c60: 70 44 69 72 74 79 2c 20 2a 70 50 72 65 76 44 69  pDirty, *pPrevDi
1c70: 72 74 79 3b 20 20 20 20 2f 2a 20 44 69 72 74 79  rty;    /* Dirty
1c80: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 33 32 20   pages */.  u32 
1c90: 6e 6f 74 55 73 65 64 3b 20 20 20 20 20 20 20 20  notUsed;        
1ca0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
1cb0: 66 66 65 72 20 73 70 61 63 65 20 2a 2f 0a 23 69  ffer space */.#i
1cc0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
1cd0: 4b 5f 50 41 47 45 53 0a 20 20 75 33 32 20 70 61  K_PAGES.  u32 pa
1ce0: 67 65 48 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20  geHash;.#endif. 
1cf0: 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /* pPager->page
1d00: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 70 61  Size bytes of pa
1d10: 67 65 20 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74  ge data follow t
1d20: 68 69 73 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  his header */.  
1d30: 2f 2a 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  /* Pager.nExtra 
1d40: 62 79 74 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64  bytes of local d
1d50: 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70  ata follow the p
1d60: 61 67 65 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a  age data */.};..
1d70: 2f 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d  /*.** For an in-
1d80: 6d 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61  memory only data
1d90: 62 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61  base, some extra
1da0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
1db0: 72 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a  recorded about.*
1dc0: 2a 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74  * each page so t
1dd0: 68 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20  hat changes can 
1de0: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  be rolled back. 
1df0: 20 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20   (Journal files 
1e00: 61 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20  are not.** used 
1e10: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
1e20: 74 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66  tabases.)  The f
1e30: 6f 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61  ollowing informa
1e40: 74 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f  tion is added to
1e50: 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65  .** the end of e
1e60: 76 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b  very EXTRA block
1e70: 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   for in-memory d
1e80: 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20  atabases..**.** 
1e90: 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  This information
1ea0: 20 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   could have been
1eb0: 20 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20   added directly 
1ec0: 74 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72  to the PgHdr str
1ed0: 75 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74  ucture..** But t
1ee0: 68 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b  hen it would tak
1ef0: 65 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20  e up an extra 8 
1f00: 62 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65  bytes of storage
1f10: 20 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a   on every PgHdr.
1f20: 2a 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b  ** even for disk
1f30: 2d 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73  -based databases
1f40: 2e 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20  .  Splitting it 
1f50: 6f 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65  out saves 8 byte
1f60: 73 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f  s.  This.** is o
1f70: 6e 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66  nly a savings of
1f80: 20 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20   0.8% but those 
1f90: 70 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20  percentages add 
1fa0: 75 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  up..*/.typedef s
1fb0: 74 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20  truct PgHistory 
1fc0: 50 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63  PgHistory;.struc
1fd0: 74 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20  t PgHistory {.  
1fe0: 75 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f  u8 *pOrig;     /
1ff0: 2a 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  * Original page 
2000: 74 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74  text.  Restore t
2010: 6f 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c  o this on a full
2020: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75   rollback */.  u
2030: 38 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a  8 *pStmt;     /*
2040: 20 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20   Text as it was 
2050: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2060: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
2070: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a  statement */.};.
2080: 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75  ./*.** A macro u
2090: 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67  sed for invoking
20a0: 20 74 68 65 20 63 6f 64 65 63 20 69 66 20 74 68   the codec if th
20b0: 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69  ere is one.*/.#i
20c0: 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f  fdef SQLITE_HAS_
20d0: 43 4f 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43  CODEC.# define C
20e0: 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69  ODEC1(P,D,N,X) i
20f0: 66 28 20 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20  f( P->xCodec!=0 
2100: 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  ){ P->xCodec(P->
2110: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
2120: 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  ; }.# define COD
2130: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
2140: 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21  har*)(P->xCodec!
2150: 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e  =0?P->xCodec(P->
2160: 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29  pCodecArg,D,N,X)
2170: 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  :D)).#else.# def
2180: 69 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e  ine CODEC1(P,D,N
2190: 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a  ,X) /* NO-OP */.
21a0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32 28  # define CODEC2(
21b0: 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a  P,D,N,X) ((char*
21c0: 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  )D).#endif../*.*
21d0: 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69 6e  * Convert a poin
21e0: 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20 69  ter to a PgHdr i
21f0: 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  nto a pointer to
2200: 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e 64   its data.** and
2210: 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f 0a   back again..*/.
2220: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
2230: 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69 64  _DATA(P)  ((void
2240: 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64 65  *)(&(P)[1])).#de
2250: 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47 48  fine DATA_TO_PGH
2260: 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64 72  DR(D)  (&((PgHdr
2270: 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65 66  *)(D))[-1]).#def
2280: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58 54  ine PGHDR_TO_EXT
2290: 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a 29  RA(G,P) ((void*)
22a0: 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b 31  &((char*)(&(G)[1
22b0: 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69 7a  ]))[(P)->pageSiz
22c0: 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44  e]).#define PGHD
22d0: 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52 29  R_TO_HIST(P,PGR)
22e0: 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20    \.            
22f0: 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28 28  ((PgHistory*)&((
2300: 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29 29  char*)(&(P)[1]))
2310: 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a 65  [(PGR)->pageSize
2320: 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d 29  +(PGR)->nExtra])
2330: 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65 6e 20 70  ../*.** A open p
2340: 61 67 65 20 63 61 63 68 65 20 69 73 20 61 6e 20  age cache is an 
2350: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2360: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2370: 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72  ure..**.** Pager
2380: 2e 65 72 72 43 6f 64 65 20 6d 61 79 20 62 65 20  .errCode may be 
2390: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 49 4f  set to SQLITE_IO
23a0: 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52  ERR, SQLITE_CORR
23b0: 55 50 54 2c 20 53 51 4c 49 54 45 5f 50 52 4f 54  UPT, SQLITE_PROT
23c0: 4f 43 4f 4c 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OCOL.** or SQLIT
23d0: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
23e0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
23f0: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
2400: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
2410: 2a 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65  * and is returne
2420: 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20  d as the result 
2430: 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70  of every major p
2440: 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20  ager API call.  
2450: 54 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  The.** SQLITE_FU
2460: 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69  LL return code i
2470: 73 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  s slightly diffe
2480: 72 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74  rent. It persist
2490: 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65  s only until the
24a0: 0a 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73  .** next success
24b0: 66 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  ful rollback is 
24c0: 70 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65  performed on the
24d0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c   pager cache. Al
24e0: 73 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55  so,.** SQLITE_FU
24f0: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
2500: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
2510: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
2520: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
2530: 29 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20  ).** APIs, they 
2540: 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65  may still be use
2550: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a  d successfully..
2560: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
2570: 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  {.  u8 journalOp
2580: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2590: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
25a0: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
25b0: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
25c0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
25d0: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
25e0: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
25f0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
2600: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
2610: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2620: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
2630: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
2640: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
2650: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2670: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
2680: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
2690: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
26a0: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
26b0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
26c0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
26d0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
26e0: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
26f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2700: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
2710: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
2720: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
2730: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
2740: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
2750: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
2760: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
2770: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
2780: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
27b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
27c0: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
27d0: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
27e0: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
27f0: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
2800: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
2810: 65 73 73 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  ess */.  u8 full
2820: 5f 66 73 79 6e 63 3b 20 20 20 20 20 20 20 20 20  _fsync;         
2830: 20 20 20 20 20 2f 2a 20 55 73 65 20 46 5f 46 55       /* Use F_FU
2840: 4c 4c 46 53 59 4e 43 20 77 68 65 6e 20 61 76 61  LLFSYNC when ava
2850: 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 75 38 20 73  ilable */.  u8 s
2860: 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  tate;           
2870: 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52          /* PAGER
2880: 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44  _UNLOCK, _SHARED
2890: 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63  , _RESERVED, etc
28a0: 2e 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  . */.  u8 tempFi
28b0: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
28c0: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
28d0: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
28e0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
28f0: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
2900: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
2910: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
2920: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
2930: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
2940: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2950: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
2960: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
2970: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
2980: 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20  rtyCache;       
2990: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
29a0: 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68  f cached pages h
29b0: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
29c0: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
29d0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck;          /* 
29e0: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
29f0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
2a00: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
2a10: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
2a20: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2a30: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
2a40: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
2a50: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2a60: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a70: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2a80: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2a90: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20  o jrnl */.  int 
2aa0: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
2ab0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2ac0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
2ad0: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
2ae0: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
2af0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2b00: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
2b10: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
2b20: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
2b30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
2b40: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
2b50: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
2b60: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
2b70: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2b80: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
2b90: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
2ba0: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
2bb0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
2be0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
2bf0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
2c00: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
2c10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
2c20: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
2c30: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
2c40: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
2c50: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
2c60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c70: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
2c80: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
2c90: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
2ca0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2cb0: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
2cc0: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
2cd0: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
2ce0: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
2cf0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
2d00: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2d10: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
2d20: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
2d50: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
2d60: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78  es */.  int nMax
2d70: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2d80: 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61 74 65      /* High wate
2d90: 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67 65 20  r mark of nPage 
2da0: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e   /* Number of in
2dd0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69  -memory pages wi
2de0: 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20  th PgHdr.nRef>0 
2df0: 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b  */.  int mxPage;
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62   /* Maximum numb
2e20: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68  er of pages to h
2e30: 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a  old in cache */.
2e40: 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c    u8 *aInJournal
2e50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e60: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
2e70: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
2e80: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
2e90: 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20   u8 *aInStmt;   
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2eb0: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
2ec0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
2ed0: 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  abase */.  char 
2ee0: 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  *zFilename;     
2ef0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2f00: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
2f10: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2f20: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2f30: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2f40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2f50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 69 72   */.  char *zDir
2f60: 65 63 74 6f 72 79 3b 20 20 20 20 20 20 20 20 20  ectory;         
2f70: 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 68    /* Directory h
2f80: 6f 6c 64 20 64 61 74 61 62 61 73 65 20 61 6e 64  old database and
2f90: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a   journal files *
2fa0: 2f 0a 20 20 4f 73 46 69 6c 65 20 2a 66 64 2c 20  /.  OsFile *fd, 
2fb0: 2a 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  *jfd;           
2fc0: 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2fd0: 6f 72 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  ors for database
2fe0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   and journal */.
2ff0: 20 20 4f 73 46 69 6c 65 20 2a 73 74 66 64 3b 20    OsFile *stfd; 
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3010: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
3020: 20 66 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65   for the stateme
3030: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a  nt subjournal*/.
3040: 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70    BusyHandler *p
3050: 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a  BusyHandler;  /*
3060: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
3070: 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a  te.busyHandler *
3080: 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73  /.  PgHdr *pFirs
3090: 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20 20 20  t, *pLast;      
30a0: 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65 65 20  /* List of free 
30b0: 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72  pages */.  PgHdr
30c0: 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64 3b 20   *pFirstSynced; 
30d0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
30e0: 66 72 65 65 20 70 61 67 65 20 77 69 74 68 20 50  free page with P
30f0: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30  gHdr.needSync==0
3100: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 41 6c   */.  PgHdr *pAl
3110: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3120: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
3130: 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48 64   pages */.  PgHd
3140: 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20  r *pStmt;       
3150: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
3160: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
3170: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
3180: 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48 64 72 20  rnal */.  PgHdr 
3190: 2a 70 44 69 72 74 79 3b 20 20 20 20 20 20 20 20  *pDirty;        
31a0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
31b0: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
31c0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
31d0: 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20  lOff;           
31e0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74    /* Current byt
31f0: 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20  e offset in the 
3200: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3210: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72    i64 journalHdr
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3230: 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20   Byte offset to 
3240: 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c  previous journal
3250: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34   header */.  i64
3260: 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20   stmtHdrOff;    
3270: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
3280: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
3290: 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74   written this st
32a0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34  atement */.  i64
32b0: 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20   stmtCksum;     
32c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75           /* cksu
32d0: 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65  mInit when state
32e0: 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64  ment was started
32f0: 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a 53   */.  i64 stmtJS
3300: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3310: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f 75    /* Size of jou
3320: 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65 67  rnal at stmt_beg
3330: 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73 65  in() */.  int se
3340: 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20  ctorSize;       
3350: 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65 64        /* Assumed
3360: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75 72   sector size dur
3370: 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a  ing rollback */.
3380: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3390: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
33a0: 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20  Miss, nOvfl;    
33b0: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20   /* Cache hits, 
33c0: 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55  missing, and LRU
33d0: 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20   overflows */.  
33e0: 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65  int nRead,nWrite
33f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ;           /* D
3400: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
3410: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
3420: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 44  ndif.  void (*xD
3430: 65 73 74 72 75 63 74 6f 72 29 28 44 62 50 61 67  estructor)(DbPag
3440: 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c  e*,int); /* Call
3450: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
3460: 65 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73  en freeing pages
3470: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65   */.  void (*xRe
3480: 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a 2c  initer)(DbPage*,
3490: 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20  int);   /* Call 
34a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
34b0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
34c0: 73 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 28 2a 78  s */.  void *(*x
34d0: 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69  Codec)(void*,voi
34e0: 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a  d*,Pgno,int); /*
34f0: 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f   Routine for en/
3500: 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f  decoding data */
3510: 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
3520: 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  rg;            /
3530: 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74  * First argument
3540: 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a   to xCodec() */.
3550: 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20 20 20    int nHash;    
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3570: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67   Size of the pag
3580: 65 72 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  er hash table */
3590: 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61 73 68  .  PgHdr **aHash
35a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
35b0: 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f 20  * Hash table to 
35c0: 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72 20  map page number 
35d0: 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69 66 64  to PgHdr */.#ifd
35e0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
35f0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
3600: 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e 65 78  NT.  Pager *pNex
3610: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3620: 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c 69 73 74 20   /* Linked list 
3630: 6f 66 20 70 61 67 65 72 73 20 69 6e 20 74 68 69  of pagers in thi
3640: 73 20 74 68 72 65 61 64 20 2a 2f 0a 23 65 6e 64  s thread */.#end
3650: 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70 53  if.  char *pTmpS
3660: 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20  pace;           
3670: 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53 69   /* Pager.pageSi
3680: 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  ze bytes of spac
3690: 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a 2f  e for tmp use */
36a0: 0a 20 20 75 33 32 20 69 43 68 61 6e 67 65 43 6f  .  u32 iChangeCo
36b0: 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  unt;           /
36c0: 2a 20 44 62 20 63 68 61 6e 67 65 2d 63 6f 75 6e  * Db change-coun
36d0: 74 65 72 20 66 6f 72 20 77 68 69 63 68 20 63 61  ter for which ca
36e0: 63 68 65 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  che is valid */.
36f0: 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20    u8 doNotSync; 
3700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3710: 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20   Boolean. While 
3720: 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69  true, do not spi
3730: 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  ll the cache */.
3740: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
3750: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
3760: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
3770: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
3780: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
3790: 38 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  8 changeCountDon
37a0: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65  e;         /* Se
37b0: 74 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e  t after incremen
37c0: 74 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d  ting the change-
37d0: 63 6f 75 6e 74 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f  counter */.};../
37e0: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 54  *.** If SQLITE_T
37f0: 45 53 54 20 69 73 20 64 65 66 69 6e 65 64 20 74  EST is defined t
3800: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
3810: 65 20 76 61 72 69 61 62 6c 65 20 67 69 76 65 6e  e variable given
3820: 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72 67 75 6d   in.** the argum
3830: 65 6e 74 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ent.*/.#ifdef SQ
3840: 4c 49 54 45 5f 54 45 53 54 0a 23 20 64 65 66 69  LITE_TEST.# defi
3850: 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78 29 20  ne TEST_INCR(x) 
3860: 20 78 2b 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66   x++.#else.# def
3870: 69 6e 65 20 54 45 53 54 5f 49 4e 43 52 28 78 29  ine TEST_INCR(x)
3880: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4a  .#endif../*.** J
3890: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
38a0: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
38b0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
38c0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
38d0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
38e0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
38f0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
3900: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
3910: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
3920: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
3930: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
3940: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
3950: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
3960: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3970: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
3980: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
3990: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
39a0: 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  egin.** written,
39b0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
39c0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
39d0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
39e0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
39f0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
3a00: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
3a10: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
3a20: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
3a30: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
3a40: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
3a50: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
3a60: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
3a70: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
3a80: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
3a90: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
3aa0: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
3ab0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3ac0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
3ad0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
3ae0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3af0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
3b00: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
3b10: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
3b20: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
3b30: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
3b40: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
3b50: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
3b60: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
3b70: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
3b80: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
3b90: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
3ba0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
3bb0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
3bc0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
3bd0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
3be0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
3bf0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
3c00: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
3c10: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
3c20: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
3c30: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
3c40: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
3c50: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
3c60: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
3c70: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
3c80: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
3c90: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
3ca0: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
3cb0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
3cc0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
3cd0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
3ce0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
3cf0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
3d00: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
3d10: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
3d20: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
3d30: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
3d40: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
3d50: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
3d60: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
3d70: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
3d80: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
3d90: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
3da0: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
3db0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
3dc0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
3dd0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
3de0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
3df0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
3e00: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
3e10: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
3e20: 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65  and of each page
3e30: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3e40: 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a  is determined.**
3e50: 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   by the followin
3e60: 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65  g macros..*/.#de
3e70: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  fine JOURNAL_PG_
3e80: 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50  SZ(pPager)  ((pP
3e90: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
3ea0: 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  + 8)../*.** The 
3eb0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
3ec0: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ize for this pag
3ed0: 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72  er. In the futur
3ee0: 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65  e, this could be
3ef0: 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20  .** set to some 
3f00: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
3f10: 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c  the disk control
3f20: 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61  ler. The importa
3f30: 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69  nt.** characteri
3f40: 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20  stic is that it 
3f50: 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  is the same size
3f60: 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f   as a disk secto
3f70: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  r..*/.#define JO
3f80: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
3f90: 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65  ger) (pPager->se
3fa0: 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a  ctorSize)../*.**
3fb0: 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42   The macro MEMDB
3fc0: 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61   is true if we a
3fd0: 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20  re dealing with 
3fe0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
3ff0: 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20  abase..** We do 
4000: 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20  this as a macro 
4010: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53  so that if the S
4020: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
4030: 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74  YDB macro is set
4040: 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f  ,.** the value o
4050: 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20  f MEMDB will be 
4060: 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74  a constant and t
4070: 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c  he compiler will
4080: 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74   optimize.** out
4090: 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64   code that would
40a0: 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a   never execute..
40b0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
40c0: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23  _OMIT_MEMORYDB.#
40d0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a   define MEMDB 0.
40e0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d  #else.# define M
40f0: 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d  EMDB pPager->mem
4100: 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  Db.#endif../*.**
4110: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47   Page number PAG
4120: 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65  ER_MJ_PGNO is ne
4130: 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53  ver used in an S
4140: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28  QLite database (
4150: 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65  it is.** reserve
4160: 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72  d for working ar
4170: 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70  ound a windows/p
4180: 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69  osix incompatibi
4190: 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20  lity). It is.** 
41a0: 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  used in the jour
41b0: 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  nal to signify t
41c0: 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65  hat the remainde
41d0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
41e0: 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76   file .** is dev
41f0: 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20  oted to storing 
4200: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
4210: 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72   name - there ar
4220: 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20  e no more pages 
4230: 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e  to.** roll back.
4240: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f   See comments fo
4250: 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  r function write
4260: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
4270: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
4280: 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52  /* #define PAGER
4290: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e  _MJ_PGNO(x) (PEN
42a0: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
42b0: 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64  pageSize)) */.#d
42c0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
42d0: 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47  GNO(x) ((PENDING
42e0: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
42f0: 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  Size))+1)../*.**
4300: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
4310: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
4320: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
4330: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
4340: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
4350: 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  47../*.** Enable
4360: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4370: 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64   tracking (for d
4380: 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a  ebugging) here:.
4390: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
43a0: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
43b0: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
43c0: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
43d0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
43e0: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
43f0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
4400: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
4410: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
4420: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
4430: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4440: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
4450: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
4460: 25 70 20 6e 52 65 66 3d 25 2d 33 64 20 74 6f 74  %p nRef=%-3d tot
4470: 61 6c 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  al=%d\n",.      
4480: 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f   p->pgno, PGHDR_
4490: 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e  TO_DATA(p), p->n
44a0: 52 65 66 2c 20 70 2d 3e 70 50 61 67 65 72 2d 3e  Ref, p->pPager->
44b0: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
44c0: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
44d0: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
44e0: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
44f0: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
4500: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
4510: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
4520: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
4530: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  (X).#endif.../*.
4540: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69  ** Change the si
4550: 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  ze of the pager 
4560: 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e  hash table to N.
4570: 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f    N must be a po
4580: 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a  wer.** of two..*
4590: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
45a0: 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
45b0: 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61  table(Pager *pPa
45c0: 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50  ger, int N){.  P
45d0: 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70  gHdr **aHash, *p
45e0: 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e  Pg;.  assert( N>
45f0: 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d  0 && (N&(N-1))==
4600: 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73  0 );.  aHash = s
4610: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
4620: 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e 20  eof(aHash[0])*N 
4630: 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d  );.  if( aHash==
4640: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c  0 ){.    /* Fail
4650: 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73  ure to rehash is
4660: 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20   not an error.  
4670: 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72  It is only a per
4680: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f  formance hit. */
4690: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
46a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
46b0: 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
46c0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
46d0: 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  N;.  pPager->aHa
46e0: 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f  sh = aHash;.  fo
46f0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
4700: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
4710: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
4720: 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20   int h;.    if( 
4730: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
4740: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
4750: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
4760: 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
4770: 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  h==0 );.      co
4780: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
4790: 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20    h = pPg->pgno 
47a0: 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67  & (N-1);.    pPg
47b0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48  ->pNextHash = aH
47c0: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20  ash[h];.    if( 
47d0: 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
47e0: 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65    aHash[h]->pPre
47f0: 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
4800: 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20   }.    aHash[h] 
4810: 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e  = pPg;.    pPg->
4820: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20  pPrevHash = 0;. 
4830: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
4840: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
4850: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
4860: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
4870: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
4880: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
4890: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
48a0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
48b0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
48c0: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
48d0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
48e0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
48f0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
4900: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
4910: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
4920: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
4930: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
4940: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32 20  OsFile *fd, u32 
4950: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
4960: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4970: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
4980: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4990: 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20 69  sizeof(ac));.  i
49a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
49b0: 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
49c0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
49d0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
49e0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
49f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4a00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4a10: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
4a20: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
4a30: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
4a40: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
4a50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
4a60: 75 74 33 32 62 69 74 73 28 63 68 61 72 20 2a 61  ut32bits(char *a
4a70: 63 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 61  c, u32 val){.  a
4a80: 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29  c[0] = (val>>24)
4a90: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d   & 0xff;.  ac[1]
4aa0: 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30   = (val>>16) & 0
4ab0: 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28  xff;.  ac[2] = (
4ac0: 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a  val>>8) & 0xff;.
4ad0: 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20    ac[3] = val & 
4ae0: 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  0xff;.}../*.** W
4af0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
4b00: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
4b10: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
4b20: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
4b30: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
4b40: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
4b50: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4b60: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
4b70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
4b80: 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ite32bits(OsFile
4b90: 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *fd, u32 val){.
4ba0: 20 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20    char ac[4];.  
4bb0: 70 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61  put32bits(ac, va
4bc0: 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  l);.  return sql
4bd0: 69 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20  ite3OsWrite(fd, 
4be0: 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ac, 4);.}../*.**
4bf0: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
4c00: 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74  nteger at offset
4c10: 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74   'offset' from t
4c20: 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
4c30: 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65  ed by.** page he
4c40: 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61  ader 'p'..*/.sta
4c50: 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65  tic u32 retrieve
4c60: 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c  32bits(PgHdr *p,
4c70: 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20   int offset){.  
4c80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
4c90: 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73  c;.  ac = &((uns
4ca0: 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44  igned char*)PGHD
4cb0: 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66  R_TO_DATA(p))[of
4cc0: 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20  fset];.  return 
4cd0: 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61  (ac[0]<<24) | (a
4ce0: 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b  c[1]<<16) | (ac[
4cf0: 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a  2]<<8) | ac[3];.
4d00: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
4d10: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
4d20: 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e  e called when an
4d30: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69   error occurs wi
4d40: 74 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a  thin the pager.*
4d50: 2a 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73  * code. The firs
4d60: 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20  t argument is a 
4d70: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
4d80: 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20  ager structure, 
4d90: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68  the.** second th
4da0: 65 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f  e error-code abo
4db0: 75 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ut to be returne
4dc0: 64 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49  d by a pager API
4dd0: 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54   function. .** T
4de0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
4df0: 64 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74  d is a copy of t
4e00: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4e10: 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  nt to this funct
4e20: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
4e30: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4e40: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
4e50: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
4e60: 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 50 52 4f  PT or SQLITE_PRO
4e70: 54 4f 43 4f 4c 2c 0a 2a 2a 20 74 68 65 20 65 72  TOCOL,.** the er
4e80: 72 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73  ror becomes pers
4e90: 69 73 74 65 6e 74 2e 20 41 6c 6c 20 73 75 62 73  istent. All subs
4ea0: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
4eb0: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 0a 2a   on this Pager.*
4ec0: 2a 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65  * will immediate
4ed0: 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73 61  ly return the sa
4ee0: 6d 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  me error code..*
4ef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
4f00: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
4f10: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
4f20: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
4f30: 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
4f40: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
4f50: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
4f60: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
4f70: 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  e==SQLITE_OK );.
4f80: 20 20 69 66 28 20 0a 20 20 20 20 72 63 32 3d 3d    if( .    rc2==
4f90: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
4fa0: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
4fb0: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
4fc0: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
4fd0: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
4fe0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 0a 20 20 29 7b  TE_PROTOCOL.  ){
4ff0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
5000: 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 0a 20  Code = rc;.  }. 
5010: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
5020: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
5030: 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52  CK_PAGES./*.** R
5040: 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68  eturn a 32-bit h
5050: 61 73 68 20 6f 66 20 74 68 65 20 70 61 67 65 20  ash of the page 
5060: 64 61 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a  data for pPage..
5070: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  */.static u32 pa
5080: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
5090: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33  dr *pPage){.  u3
50a0: 32 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e  2 hash = 0;.  in
50b0: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
50c0: 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75  char *pData = (u
50d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50  nsigned char *)P
50e0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61  GHDR_TO_DATA(pPa
50f0: 67 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ge);.  for(i=0; 
5100: 69 3c 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d  i<pPage->pPager-
5110: 3e 70 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b  >pageSize; i++){
5120: 0a 20 20 20 20 68 61 73 68 20 3d 20 28 68 61 73  .    hash = (has
5130: 68 2b 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20  h+i)^pData[i];. 
5140: 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68   }.  return hash
5150: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43  ;.}../*.** The C
5160: 48 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20  HECK_PAGE macro 
5170: 74 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61  takes a PgHdr* a
5180: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
5190: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
51a0: 41 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e  AGES.** is defin
51b0: 65 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69  ed, and NDEBUG i
51c0: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61  s not defined, a
51d0: 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
51e0: 6d 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  ment checks.** t
51f0: 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
5200: 65 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20  either dirty or 
5210: 73 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68  still matches th
5220: 65 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67  e calculated pag
5230: 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69  e-hash..*/.#defi
5240: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5250: 20 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74   checkPage(x).st
5260: 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50  atic void checkP
5270: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
5280: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
5290: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
52a0: 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
52b0: 70 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67  pageHash || pPag
52c0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d  er->errCode || M
52d0: 45 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72  EMDB || pPg->dir
52e0: 74 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67  ty || .      pPg
52f0: 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65  ->pageHash==page
5300: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20  r_pagehash(pPg) 
5310: 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66  );.}..#else.#def
5320: 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78  ine CHECK_PAGE(x
5330: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
5340: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
5350: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
5360: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
5370: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
5380: 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  en..** The maste
5390: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
53a0: 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d  ame is read from
53b0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
53c0: 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69  file and .** wri
53d0: 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  tten into memory
53e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
53f0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a  qliteMalloc(). *
5400: 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73  pzMaster is.** s
5410: 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74  et to point at t
5420: 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51  he memory and SQ
5430: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
5440: 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  . The caller mus
5450: 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28  t.** sqliteFree(
5460: 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a  ) *pzMaster..**.
5470: 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20  ** If no master 
5480: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
5490: 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a  e is present *pz
54a0: 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74 6f  Master is set to
54b0: 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45   0 and.** SQLITE
54c0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
54d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
54e0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73  MasterJournal(Os
54f0: 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61  File *pJrnl, cha
5500: 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20  r **pzMaster){. 
5510: 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c   int rc;.  u32 l
5520: 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20  en;.  i64 szJ;. 
5530: 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e   u32 cksum;.  in
5540: 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  t i;.  unsigned 
5550: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
5560: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
5570: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
5580: 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61  ader */..  *pzMa
5590: 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20  ster = 0;..  rc 
55a0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
55b0: 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29  ize(pJrnl, &szJ)
55c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
55d0: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20  TE_OK || szJ<16 
55e0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
55f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
5600: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
5610: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5620: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5630: 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61  rc;. .  rc = rea
5640: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26  d32bits(pJrnl, &
5650: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
5660: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
5670: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
5680: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
5690: 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20   &cksum);.  if( 
56a0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
56b0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
56c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
56d0: 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20  (pJrnl, aMagic, 
56e0: 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  8);.  if( rc!=SQ
56f0: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d  LITE_OK || memcm
5700: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
5710: 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65  alMagic, 8) ) re
5720: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
5730: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
5740: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e  Jrnl, szJ-16-len
5750: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5760: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5770: 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72  rc;..  *pzMaster
5780: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
5790: 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a  eMalloc(len+1);.
57a0: 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72    if( !*pzMaster
57b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
57c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
57d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
57e0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a  sRead(pJrnl, *pz
57f0: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
5800: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5810: 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  K ){.    sqliteF
5820: 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a  ree(*pzMaster);.
5830: 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20      *pzMaster = 
5840: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  0;.    return rc
5850: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20  ;.  }..  /* See 
5860: 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  if the checksum 
5870: 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73 74  matches the mast
5880: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
5890: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
58a0: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
58b0: 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74  ksum -= (*pzMast
58c0: 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66  er)[i];.  }.  if
58d0: 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f  ( cksum ){.    /
58e0: 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73 75  * If the checksu
58f0: 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70  m doesn't add up
5900: 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f  , then one or mo
5910: 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73  re of the disk s
5920: 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f  ectors.    ** co
5930: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73  ntaining the mas
5940: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
5950: 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65  name is corrupte
5960: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20  d. This means.  
5970: 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20    ** definitely 
5980: 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75  roll back, so ju
5990: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
59a0: 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61  _OK and report a
59b0: 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61   (nul).    ** ma
59c0: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster-journal fil
59d0: 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  ename..    */.  
59e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a    sqliteFree(*pz
59f0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a  Master);.    *pz
5a00: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65  Master = 0;.  }e
5a10: 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73  lse{.    (*pzMas
5a20: 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27  ter)[len] = '\0'
5a30: 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75  ;.  }.   .  retu
5a40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
5a50: 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20  ./*.** Seek the 
5a60: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
5a70: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e  criptor to the n
5a80: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
5a90: 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a  ary where a.** j
5aa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61  ournal header ma
5ab0: 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  y be read or wri
5ac0: 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72  tten. Pager.jour
5ad0: 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65  nalOff is update
5ae0: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65  d with.** the ne
5af0: 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a  w seek offset..*
5b00: 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73  *.** i.e for a s
5b10: 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31  ector size of 51
5b20: 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f  2:.**.** Input O
5b30: 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20 20  ffset           
5b40: 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74     Output Offset
5b50: 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .** ------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30  -----------.** 0
5b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5b90: 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31           0.** 51
5ba0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
5bb0: 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31          512.** 1
5bc0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
5bd0: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
5be0: 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20 20  2000            
5bf0: 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a            2048.*
5c00: 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  * .*/.static int
5c10: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
5c20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
5c30: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
5c40: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
5c50: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
5c60: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
5c70: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
5c80: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5c90: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
5ca0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5cb0: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
5cc0: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
5cd0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5ce0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
5cf0: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
5d00: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
5d10: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
5d20: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70  Z(pPager) );.  p
5d30: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5d40: 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65  f = offset;.  re
5d50: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65  turn sqlite3OsSe
5d60: 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
5d70: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5d80: 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ff);.}../*.** Th
5d90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
5da0: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
5db0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
5dc0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
5dd0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
5de0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
5df0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
5e00: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
5e10: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
5e20: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
5e30: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
5e40: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
5e50: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
5e60: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
5e70: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
5e80: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
5e90: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
5ea0: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
5eb0: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
5ec0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
5ed0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
5ee0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
5ef0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
5f00: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
5f10: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
5f20: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
5f30: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
5f40: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
5f50: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
5f60: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
5f70: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
5f80: 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20  ** .** Followed 
5f90: 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  by (JOURNAL_HDR_
5fa0: 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f  SZ - 24) bytes o
5fb0: 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a  f unused space..
5fc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
5fd0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  iteJournalHdr(Pa
5fe0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
5ff0: 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69 7a  char zHeader[siz
6000: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6010: 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72 63  c)+16];.  int rc
6020: 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
6030: 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29  >stmtHdrOff==0 )
6040: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
6050: 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65  mtHdrOff = pPage
6060: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
6070: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a   }..  rc = seekJ
6080: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
6090: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
60a0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
60b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
60c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
60d0: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
60e0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55  ournalOff += JOU
60f0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6100: 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d  er);..  /* FIX M
6110: 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f  E: .  **.  ** Po
6120: 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70 61 67  ssibly for a pag
6130: 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e  er not in no-syn
6140: 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72  c mode, the jour
6150: 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75 6c 64  nal magic should
6160: 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77 72 69   not.  ** be wri
6170: 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20  tten until nRec 
6180: 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  is filled in as 
6190: 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73 79 6e  part of next syn
61a0: 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a  cJournal(). .  *
61b0: 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20  *.  ** Actually 
61c0: 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c 65 20  maybe the whole 
61d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73  journal header s
61e0: 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79 65 64  hould be delayed
61f0: 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a   until that.  **
6200: 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62   point. Think ab
6210: 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20  out this..  */. 
6220: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
6230: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6240: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
6250: 61 67 69 63 29 29 3b 0a 20 20 2f 2a 20 54 68 65  agic));.  /* The
6260: 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46   nRec Field. 0xF
6270: 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73  FFFFFFF for no-s
6280: 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ync journals. */
6290: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
62a0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
62b0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 70 50  urnalMagic)], pP
62c0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30  ager->noSync ? 0
62d0: 78 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a  xffffffff : 0);.
62e0: 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20    /* The random 
62f0: 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69  check-hash initi
6300: 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c  aliser */ .  sql
6310: 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73  ite3Randomness(s
6320: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b  izeof(pPager->ck
6330: 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65  sumInit), &pPage
6340: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
6350: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
6360: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
6370: 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50  nalMagic)+4], pP
6380: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
6390: 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69  ;.  /* The initi
63a0: 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  al database size
63b0: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
63c0: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
63d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38  aJournalMagic)+8
63e0: 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ], pPager->dbSiz
63f0: 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61 73 73  e);.  /* The ass
6400: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
6410: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
6420: 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73  s */.  put32bits
6430: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
6440: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
6450: 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  12], pPager->sec
6460: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 49 4f 54 52  torSize);.  IOTR
6470: 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
6480: 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
6490: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
64a0: 6c 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65  lHdr, sizeof(zHe
64b0: 61 64 65 72 29 29 29 0a 20 20 72 63 20 3d 20 73  ader))).  rc = s
64c0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
64d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
64e0: 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
64f0: 65 72 29 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  er));..  /* The 
6500: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
6510: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
6520: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
6530: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
6540: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
6550: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
6560: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
6570: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
6580: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
6590: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 49 4f 54  TE_OK ){.    IOT
65a0: 52 41 43 45 28 28 22 4a 54 41 49 4c 20 25 70 20  RACE(("JTAIL %p 
65b0: 25 6c 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %lld\n", pPager,
65c0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
65d0: 4f 66 66 2d 31 29 29 0a 20 20 20 20 72 63 20 3d  Off-1)).    rc =
65e0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
65f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
6600: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31  er->journalOff-1
6610: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
6620: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
6630: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6640: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
6650: 64 2c 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20  d, "\000", 1);. 
6660: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6670: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
6680: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
6690: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
66a0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
66b0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
66c0: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
66d0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
66e0: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
66f0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
6700: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
6710: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
6720: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
6730: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
6740: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
6750: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
6760: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
6770: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
6780: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
6790: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
67a0: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
67b0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
67c0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
67d0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
67e0: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
67f0: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
6800: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
6810: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
6820: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
6830: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
6840: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
6850: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
6860: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
6870: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
6880: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
6890: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
68a0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
68b0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
68c0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
68d0: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
68e0: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
68f0: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
6900: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
6910: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
6920: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
6930: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
6940: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
6950: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
6960: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6970: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
6980: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
6990: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
69a0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
69b0: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
69c0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
69d0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
69e0: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
69f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
6a00: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
6a10: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
6a20: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
6a30: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20  gic header */.. 
6a40: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
6a50: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
6a60: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6a70: 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  rc;..  if( pPage
6a80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f  r->journalOff+JO
6a90: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
6aa0: 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69  ger) > journalSi
6ab0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
6ac0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
6ad0: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
6ae0: 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
6af0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
6b00: 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20  eof(aMagic));.  
6b10: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6b20: 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d  rc;..  if( memcm
6b30: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
6b40: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
6b50: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
6b60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6b70: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
6b80: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6b90: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63  ager->jfd, pNRec
6ba0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6bb0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6bc0: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
6bd0: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
6be0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
6bf0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6c00: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
6c10: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
6c20: 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20  fd, pDbSize);.  
6c30: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6c40: 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65  rc;..  /* Update
6c50: 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   the assumed sec
6c60: 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63  tor-size to matc
6c70: 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65 64  h the value used
6c80: 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72   by .  ** the pr
6c90: 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61 74  ocess that creat
6ca0: 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  ed this journal.
6cb0: 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   If this journal
6cc0: 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65   was.  ** create
6cd0: 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f  d by a process o
6ce0: 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f  ther than this o
6cf0: 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  ne, then this ro
6d00: 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65  utine.  ** is be
6d10: 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20  ing called from 
6d20: 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61  within pager_pla
6d30: 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63  yback(). The loc
6d40: 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66  al value.  ** of
6d50: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
6d60: 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61 74  e is restored at
6d70: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74   the end of that
6d80: 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20   routine..  */. 
6d90: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6da0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75  (pPager->jfd, (u
6db0: 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65  32 *)&pPager->se
6dc0: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28  ctorSize);.  if(
6dd0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6de0: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
6df0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
6e00: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
6e10: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
6e20: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
6e30: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
6e40: 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72  nalOff);.  retur
6e50: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
6e60: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
6e70: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
6e80: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
6e90: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
6ea0: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
6eb0: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
6ec0: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
6ed0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6ee0: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
6ef0: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
6f00: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
6f10: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
6f20: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
6f30: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
6f40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
6f50: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
6f60: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
6f70: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
6f80: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
6f90: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
6fa0: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
6fb0: 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  *.** + 4 bytes: 
6fc0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a  PAGER_MJ_PGNO..*
6fd0: 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e  * + N bytes: len
6fe0: 67 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  gth of master jo
6ff0: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b  urnal name..** +
7000: 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b   4 bytes: N.** +
7010: 20 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72   4 bytes: Master
7020: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68   journal name ch
7030: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62  ecksum..** + 8 b
7040: 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61  ytes: aJournalMa
7050: 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  gic[]..**.** The
7060: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7070: 70 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73  page checksum is
7080: 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20   the sum of the 
7090: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
70a0: 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e  ter.** journal n
70b0: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d  ame..**.** If zM
70c0: 61 73 74 65 72 20 69 73 20 61 20 4e 55 4c 4c 20  aster is a NULL 
70d0: 70 6f 69 6e 74 65 72 20 28 6f 63 63 75 72 73 20  pointer (occurs 
70e0: 66 6f 72 20 61 20 73 69 6e 67 6c 65 20 64 61 74  for a single dat
70f0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
7100: 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c  n), .** this cal
7110: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  l is a no-op..*/
7120: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
7130: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
7140: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
7150: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
7160: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
7170: 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20  int len; .  int 
7180: 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  i; .  u32 cksum 
7190: 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
71a0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
71b0: 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20  Magic)+2*4];..  
71c0: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
71d0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
71e0: 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r) return SQLITE
71f0: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  _OK;.  pPager->s
7200: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20  etMaster = 1;.. 
7210: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d   len = strlen(zM
7220: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
7230: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
7240: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
7250: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
7260: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
7270: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
7280: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
7290: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
72a0: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
72b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
72c0: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
72d0: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
72e0: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
72f0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
7300: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
7310: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
7320: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
7330: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
7340: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
7350: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
7360: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7370: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7380: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
7390: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e  urnalOff += (len
73a0: 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72  +20);..  rc = wr
73b0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
73c0: 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f  ->jfd, PAGER_MJ_
73d0: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
73e0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
73f0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7400: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
7410: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7420: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
7430: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7440: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7450: 72 63 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73  rc;..  put32bits
7460: 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70  (zBuf, len);.  p
7470: 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34  ut32bits(&zBuf[4
7480: 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d  ], cksum);.  mem
7490: 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a  cpy(&zBuf[8], aJ
74a0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
74b0: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
74c0: 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  c));.  rc = sqli
74d0: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
74e0: 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b  r->jfd, zBuf, 8+
74f0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7500: 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65 72  agic));.  pPager
7510: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
7520: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
7530: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
7540: 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76  .** Add or remov
7550: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
7560: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
7570: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
7580: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
7590: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
75a0: 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20  The Pager keeps 
75b0: 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20  a separate list 
75c0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72  of pages that ar
75d0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a  e currently in.*
75e0: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
75f0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68  journal.  This h
7600: 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33  elps the sqlite3
7610: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
7620: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e  ).** routine run
7630: 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72   MUCH faster for
7640: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
7650: 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
7660: 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69   many.** pages i
7670: 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c  n memory but onl
7680: 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74  y a few are in t
7690: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
76a0: 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
76b0: 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f  void page_add_to
76c0: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
76d0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
76e0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
76f0: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67  Pager;.  if( pPg
7700: 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72  ->inStmt ) retur
7710: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  n;.  assert( pPg
7720: 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26  ->pPrevStmt==0 &
7730: 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  & pPg->pNextStmt
7740: 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50  ==0 );.  pPg->pP
7750: 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  revStmt = 0;.  i
7760: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
7770: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
7780: 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  pStmt->pPrevStmt
7790: 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
77a0: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  g->pNextStmt = p
77b0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20  Pager->pStmt;.  
77c0: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
77d0: 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  pPg;.  pPg->inSt
77e0: 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63  mt = 1;.}.static
77f0: 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76   void page_remov
7800: 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
7810: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
7820: 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74  if( !pPg->inStmt
7830: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
7840: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
7850: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
7860: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70  Pg->pPrevStmt->p
7870: 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b  NextStmt==pPg );
7880: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53  .    pPg->pPrevS
7890: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  tmt->pNextStmt =
78a0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
78b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
78c0: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
78d0: 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b  r->pStmt==pPg );
78e0: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
78f0: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  ->pStmt = pPg->p
7900: 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  NextStmt;.  }.  
7910: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  if( pPg->pNextSt
7920: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
7930: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
7940: 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67  ->pPrevStmt==pPg
7950: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   );.    pPg->pNe
7960: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
7970: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74  t = pPg->pPrevSt
7980: 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  mt;.  }.  pPg->p
7990: 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
79a0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
79b0: 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d   0;.  pPg->inStm
79c0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
79d0: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
79e0: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
79f0: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
7a00: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
7a10: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
7a20: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
7a30: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
7a40: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
7a50: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
7a60: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
7a70: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b  no){.  PgHdr *p;
7a80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
7a90: 48 61 73 68 3d 3d 30 20 29 20 72 65 74 75 72 6e  Hash==0 ) return
7aa0: 20 30 3b 0a 20 20 70 20 3d 20 70 50 61 67 65 72   0;.  p = pPager
7ab0: 2d 3e 61 48 61 73 68 5b 70 67 6e 6f 20 26 20 28  ->aHash[pgno & (
7ac0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
7ad0: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
7ae0: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
7af0: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
7b00: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
7b10: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7b20: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
7b30: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  base file..*/.st
7b40: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7b50: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
7b60: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50  ager){.  if( !pP
7b70: 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
7b80: 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ode ){.    if( !
7b90: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
7ba0: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
7bb0: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
7bc0: 43 4b 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  CK);.      pPage
7bd0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
7be0: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
7bf0: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
7c00: 61 67 65 72 29 29 0a 20 20 20 20 7d 0a 20 20 20  ager)).    }.   
7c10: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7c20: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
7c30: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
7c40: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
7c50: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 65    }.}../*.** Exe
7c60: 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20  cute a rollback 
7c70: 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
7c80: 20 69 73 20 61 63 74 69 76 65 20 61 6e 64 20 75   is active and u
7c90: 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20 64 61  nlock the .** da
7ca0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69  tabase file. Thi
7cb0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  s is a no-op if 
7cc0: 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c  the pager has al
7cd0: 72 65 61 64 79 20 65 6e 74 65 72 65 64 0a 2a 2a  ready entered.**
7ce0: 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61 74 65   the error-state
7cf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7d00: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
7d10: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
7d20: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72 43  ){.  if( p->errC
7d30: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
7d40: 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
7d50: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
7d60: 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70   || p->journalOp
7d70: 65 6e 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  en==0 );.  if( p
7d80: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
7d90: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
7da0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
7db0: 61 63 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61  ack(p);.  }.  pa
7dc0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20  ger_unlock(p);. 
7dd0: 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43   assert( p->errC
7de0: 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e  ode || !p->journ
7df0: 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78  alOpen || (p->ex
7e00: 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d  clusiveMode&&!p-
7e10: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a  >journalOff) );.
7e20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
7e30: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74  Code || !p->stmt
7e40: 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75  Open || p->exclu
7e50: 73 69 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 0a  siveMode );.}...
7e60: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
7e70: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
7e80: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
7e90: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
7ea0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
7eb0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
7ec0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
7ed0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
7ee0: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
7ef0: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
7f00: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
7f10: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
7f20: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
7f30: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
7f40: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
7f50: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
7f60: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
7f70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7f80: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
7f90: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
7fa0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
7fb0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7fc0: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
7fd0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
7fe0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
7ff0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
8000: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
8010: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
8020: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
8030: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
8040: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46   0;.  pPager->pF
8050: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
8060: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
8070: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
8080: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
8090: 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20  ger->pAll = 0;. 
80a0: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
80b0: 20 30 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65   0;.  sqliteFree
80c0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
80d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
80e0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
80f0: 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61  aHash = 0;.  pPa
8100: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d  ger->nRef = 0;.}
8110: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
8120: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8130: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
8140: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
8150: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
8160: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
8170: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
8180: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
8190: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65  his routine rele
81a0: 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  ases.** the data
81b0: 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63  base lock and ac
81c0: 71 75 69 72 65 73 20 61 20 53 48 41 52 45 44 20  quires a SHARED 
81d0: 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63  lock in its plac
81e0: 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a  e.  The journal.
81f0: 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  ** file is delet
8200: 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a  ed and closed..*
8210: 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  *.** TODO: Consi
8220: 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20  der keeping the 
8230: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8240: 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  n for temporary 
8250: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68  databases..** Th
8260: 69 73 20 6d 69 67 68 74 20 67 69 76 65 20 61 20  is might give a 
8270: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
8280: 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f  ovement on windo
8290: 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67  ws where opening
82a0: 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e  .** a file is an
82b0: 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61   expensive opera
82c0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
82d0: 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74  int pager_unwrit
82e0: 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  elock(Pager *pPa
82f0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
8300: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
8310: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65  QLITE_OK;.  asse
8320: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
8330: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8340: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
8350: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
8360: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
8370: 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
8380: 43 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  Commit(pPager);.
8390: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
83a0: 6d 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65  mtOpen && !pPage
83b0: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
83c0: 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61   ){.    if( !pPa
83d0: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
83e0: 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  de ){.      sqli
83f0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
8400: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 20  er->stfd);.     
8410: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
8420: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 0;.    }else
8430: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  {.      sqlite3O
8440: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
8450: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
8460: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  }.  }.  if( pPag
8470: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
8480: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
8490: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
84a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
84b0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
84c0: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
84d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
84e0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
84f0: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
8500: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
8510: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
8520: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
8530: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8540: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
8550: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  e(&pPager->jfd);
8560: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
8570: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
8580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
8590: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a  elete(pPager->zJ
85a0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 7d 0a 20  ournal);.    }. 
85b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70     sqliteFree( p
85c0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
85d0: 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  l );.    pPager-
85e0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
85f0: 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
8600: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
8610: 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
8620: 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  l){.      pPg->i
8630: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
8640: 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
8650: 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
8660: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
8670: 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f     pPg->alwaysRo
8680: 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64  llback = 0;.#ifd
8690: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
86a0: 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
86b0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
86c0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
86d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
86e0: 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
86f0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
8700: 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30  ->dirtyCache = 0
8710: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
8720: 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  ec = 0;.  }else{
8730: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
8740: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
8750: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
8760: 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
8770: 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
8780: 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30  r->useJournal==0
8790: 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70   );.  }.  if( !p
87a0: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
87b0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Mode ){.    rc =
87c0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
87d0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
87e0: 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70  RED_LOCK);.    p
87f0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
8800: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d  AGER_SHARED;.  }
8810: 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
8820: 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
8830: 4e 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67  NCED ){.    pPag
8840: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
8850: 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
8860: 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
8870: 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  bSize = 0;.  pPa
8880: 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d  ger->setMaster =
8890: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
88a0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
88b0: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
88c0: 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
88d0: 72 73 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  rst;.  pPager->d
88e0: 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
88f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8900: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
8910: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
8920: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
8930: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
8940: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
8950: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
8960: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
8970: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
8980: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
8990: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
89a0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
89b0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
89c0: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
89d0: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
89e0: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
89f0: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
8a00: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
8a10: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
8a20: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
8a30: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
8a40: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
8a50: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
8a60: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
8a70: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
8a80: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
8a90: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
8aa0: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
8ab0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
8ac0: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
8ad0: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
8ae0: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
8af0: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
8b00: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
8b10: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
8b20: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
8b30: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
8b40: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
8b50: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
8b60: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
8b70: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
8b80: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
8b90: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
8ba0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
8bb0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
8bc0: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
8bd0: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
8be0: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
8bf0: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
8c00: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
8c10: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
8c20: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
8c30: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
8c40: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
8c50: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
8c60: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
8c70: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
8c80: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
8c90: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
8ca0: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
8cb0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
8cc0: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
8cd0: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
8ce0: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
8cf0: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
8d00: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
8d10: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
8d20: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
8d30: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
8d40: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
8d50: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
8d60: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
8d70: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8d80: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
8d90: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
8da0: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
8db0: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
8dc0: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
8dd0: 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
8de0: 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
8df0: 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c 65  tic void makeCle
8e00: 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f 2a 0a  an(PgHdr*);../*.
8e10: 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  ** Read a single
8e20: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a   page from the j
8e30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
8e40: 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  ed on file descr
8e50: 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50  iptor.** jfd.  P
8e60: 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65  layback this one
8e70: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
8e80: 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d  useCksum==0 it m
8e90: 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61  eans this journa
8ea0: 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63  l does not use c
8eb0: 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b  hecksums.  Check
8ec0: 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20  sums.** are not 
8ed0: 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e  used in statemen
8ee0: 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75  t journals becau
8ef0: 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  se statement jou
8f00: 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20  rnals do not.** 
8f10: 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65 20  need to survive 
8f20: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a  power failures..
8f30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
8f40: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
8f50: 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  _page(Pager *pPa
8f60: 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64  ger, OsFile *jfd
8f70: 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b  , int useCksum){
8f80: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
8f90: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
8fa0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
8fb0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
8fc0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
8fd0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
8fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8ff0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
9000: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
9010: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
9020: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
9030: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
9040: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
9050: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
9060: 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20  /.  u8 *aData = 
9070: 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
9080: 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65  mpSpace;   /* Te
9090: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
90a0: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75   page */..  /* u
90b0: 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62  seCksum should b
90c0: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
90d0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
90e0: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
90f0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
9100: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
9110: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
9120: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
9130: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75  ssert( jfd == (u
9140: 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72  seCksum ? pPager
9150: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
9160: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
9170: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
9180: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
9190: 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  fd, &pgno);.  if
91a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
91b0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
91c0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
91d0: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
91e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
91f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
9200: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
9210: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
9220: 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72  nalOff += pPager
9230: 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b 0a  ->pageSize + 4;.
9240: 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68 65  .  /* Sanity che
9250: 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61 67  cking on the pag
9260: 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65  e.  This is more
9270: 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
9280: 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 2a  I originally.  *
9290: 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20 61  * thought.  If a
92a0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
92b0: 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65 20  ccurs while the 
92c0: 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e 67  journal is being
92d0: 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20 69   written,.  ** i
92e0: 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69 6e  t could cause in
92f0: 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62 65  valid data to be
9300: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
9310: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20 6e  e journal.  We n
9320: 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74 65  eed to.  ** dete
9330: 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64 20  ct this invalid 
9340: 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68 20  data (with high 
9350: 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e 64  probability) and
9360: 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a 2f   ignore it..  */
9370: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 7c  .  if( pgno==0 |
9380: 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a  | pgno==PAGER_MJ
9390: 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b  _PGNO(pPager) ){
93a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
93b0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69  TE_DONE;.  }.  i
93c0: 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e 65  f( pgno>(unsigne
93d0: 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
93e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
93f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
9400: 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b 0a  if( useCksum ){.
9410: 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32 62      rc = read32b
9420: 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d 29  its(jfd, &cksum)
9430: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
9440: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
9450: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9460: 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20 70   += 4;.    if( p
9470: 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65  ager_cksum(pPage
9480: 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d  r, aData)!=cksum
9490: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
94a0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
94b0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
94c0: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
94d0: 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ==PAGER_RESERVED
94e0: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74   || pPager->stat
94f0: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
9500: 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  VE );..  /* If t
9510: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52  he pager is in R
9520: 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
9530: 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62  hen there must b
9540: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73  e a copy of this
9550: 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  .  ** page in th
9560: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49  e pager cache. I
9570: 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74  n this case just
9580: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
9590: 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f  r cache,.  ** no
95a0: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
95b0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
95c0: 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72   left marked dir
95d0: 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ty in this case.
95e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
95f0: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
9600: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
9610: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
9620: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
9630: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
9640: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
9650: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
9660: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
9670: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
9680: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
9690: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
96a0: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
96b0: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
96c0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
96d0: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
96e0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
96f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
9700: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
9710: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
9720: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
9730: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
9740: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
9750: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
9760: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
9770: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
9780: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
9790: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
97a0: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
97b0: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
97c0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
97d0: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
97e0: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
97f0: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
9800: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20  contents are in 
9810: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
9820: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
9830: 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61   Otherwise, if a
9840: 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f   full ROLLBACK o
9850: 63 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20  ccurs after the 
9860: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72  statement.  ** r
9870: 6f 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c  ollback the full
9880: 20 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e   ROLLBACK will n
9890: 6f 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70  ot restore the p
98a0: 61 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  age to its origi
98b0: 6e 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74  nal.  ** content
98c0: 2e 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e  .  Two condition
98d0: 73 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65  s must be met be
98e0: 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20  fore writing to 
98f0: 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a  the database.  *
9900: 2a 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65  * files. (1) the
9910: 20 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62   database must b
9920: 65 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77  e locked.  (2) w
9930: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20  e know that the 
9940: 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61  original.  ** pa
9950: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e  ge content is in
9960: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
9970: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
9980: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
9990: 20 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f   in.  ** cache o
99a0: 72 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72  r else it is mar
99b0: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
99c0: 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  =0..  */.  pPg =
99d0: 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
99e0: 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61  ager, pgno);.  a
99f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
9a00: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
9a10: 55 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20  USIVE || pPg!=0 
9a20: 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 33  );.  PAGERTRACE3
9a30: 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61  ("PLAYBACK %d pa
9a40: 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
9a50: 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29  D(pPager), pgno)
9a60: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
9a70: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
9a80: 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d  LUSIVE && (pPg==
9a90: 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79  0 || pPg->needSy
9aa0: 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63  nc==0) ){.    rc
9ab0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
9ac0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  (pPager->fd, (pg
9ad0: 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
9ae0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9af0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9b00: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
9b10: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9b20: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  (pPager->fd, aDa
9b30: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
9b40: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Size);.    }.   
9b50: 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20   if( pPg ){.    
9b60: 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29    makeClean(pPg)
9b70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
9b80: 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20  ( pPg ){.    /* 
9b90: 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65  No page should e
9ba0: 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c  ver be explicitl
9bb0: 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68  y rolled back th
9bc0: 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78  at is in use, ex
9bd0: 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20  cept.    ** for 
9be0: 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20  page 1 which is 
9bf0: 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f  held in use in o
9c00: 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65  rder to keep the
9c10: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
9c20: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74   ** database act
9c30: 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63  ive. However suc
9c40: 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20  h a page may be 
9c50: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61  rolled back as a
9c60: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f   result.    ** o
9c70: 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
9c80: 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e  ror resulting in
9c90: 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61   an automatic ca
9ca0: 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
9cb0: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
9cc0: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
9cd0: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
9ce0: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
9cf0: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
9d00: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
9d10: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
9d20: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
9d30: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
9d40: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
9d50: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
9d60: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
9d70: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
9d80: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
9d90: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
9da0: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
9db0: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
9dc0: 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  pPg, pPager->pag
9dd0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69  eSize);.    }.#i
9de0: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
9df0: 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d  K_PAGES.    pPg-
9e00: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
9e10: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
9e20: 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f 44 45  .#endif.    CODE
9e30: 43 31 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C1(pPager, pData
9e40: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
9e50: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73  ..    /* If this
9e60: 20 77 61 73 20 70 61 67 65 20 31 2c 20 74 68 65   was page 1, the
9e70: 6e 20 72 65 73 74 6f 72 65 20 74 68 65 20 76 61  n restore the va
9e80: 6c 75 65 20 6f 66 20 50 61 67 65 72 2e 69 43 68  lue of Pager.iCh
9e90: 61 6e 67 65 43 6f 75 6e 74 20 2a 2f 0a 20 20 20  angeCount */.   
9ea0: 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
9eb0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 43        pPager->iC
9ec0: 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65 74  hangeCount = ret
9ed0: 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67 2c  rieve32bits(pPg,
9ee0: 20 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   24);.    }.  }.
9ef0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9f00: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
9f10: 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
9f20: 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
9f30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
9f40: 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
9f50: 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
9f60: 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
9f70: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9f80: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
9f90: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
9fa0: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
9fb0: 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
9fc0: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
9fd0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9fe0: 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
9ff0: 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
a000: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
a010: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
a020: 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65 73  ntains the names
a030: 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a 6f   of all child jo
a040: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65  urnals..** To te
a050: 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20 6a  ll if a master j
a060: 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64 65  ournal can be de
a070: 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f 20  leted, check to 
a080: 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20 63  each of the.** c
a090: 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c 6c  hildren.  If all
a0a0: 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65 69   children are ei
a0b0: 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72 20  ther missing or 
a0c0: 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 0a  do not refer to.
a0d0: 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  ** a different m
a0e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20 74  aster journal, t
a0f0: 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72 20  hen this master 
a100: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
a110: 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  eleted..*/.stati
a120: 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c 6d  c int pager_delm
a130: 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  aster(const char
a140: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
a150: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74  t rc;.  int mast
a160: 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 4f  er_open = 0;.  O
a170: 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d 20  sFile *master = 
a180: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  0;.  char *zMast
a190: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
a1a0: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
a1b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
a1c0: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
a1d0: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
a1e0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
a1f0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a200: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
a210: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a220: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
a230: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
a240: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
a250: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
a260: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
a270: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
a280: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
a290: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  rence..  */.  rc
a2a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
a2b0: 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72  ReadOnly(zMaster
a2c0: 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69 66  , &master);.  if
a2d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a2e0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
a2f0: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
a300: 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  pen = 1;.  rc = 
a310: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
a320: 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  e(master, &nMast
a330: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
a340: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a350: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
a360: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
a370: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
a380: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
a390: 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
a3a0: 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a  MasterPtr = 0;..
a3b0: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
a3c0: 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
a3d0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
a3e0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
a3f0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
a400: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  eMalloc() and po
a410: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
a420: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
a430: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
a440: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
a450: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d  )sqliteMalloc(nM
a460: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
a470: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
a480: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
a490: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
a4a0: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
a4b0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
a4c0: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
a4d0: 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72  te3OsRead(master
a4e0: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
a4f0: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
a500: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
a510: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
a520: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
a530: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a      zJournal = z
a540: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
a550: 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72     while( (zJour
a560: 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
a570: 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
a580: 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
a590: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
a5a0: 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b  sts(zJournal) ){
a5b0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
a5c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
a5d0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
a5e0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a5f0: 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
a600: 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
a610: 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
a620: 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
a630: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
a640: 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
a650: 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
a660: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
a670: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
a680: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
a690: 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20  OsFile *journal 
a6a0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
a6b0: 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20   c;..        rc 
a6c0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
a6d0: 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c  eadOnly(zJournal
a6e0: 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  , &journal);.   
a6f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
a700: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
a710: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
a720: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
a730: 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
a740: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
a750: 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73  l(journal, &zMas
a760: 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20  terPtr);.       
a770: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
a780: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
a790: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
a7a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
a7b0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a7c0: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a7d0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61  .        c = zMa
a7e0: 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74  sterPtr!=0 && st
a7f0: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
a800: 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20   zMaster)==0;.  
a810: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
a820: 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  (zMasterPtr);.  
a830: 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20        if( c ){. 
a840: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68           /* We h
a850: 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20  ave a match. Do 
a860: 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
a870: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
a880: 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  le. */.         
a890: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
a8a0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  out;.        }. 
a8b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f       }.      zJo
a8c0: 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e  urnal += (strlen
a8d0: 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20  (zJournal)+1);. 
a8e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71     }.  }.  .  sq
a8f0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d  lite3OsDelete(zM
a900: 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74  aster);..delmast
a910: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
a920: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
a930: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
a940: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
a950: 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74    }  .  if( mast
a960: 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73  er_open ){.    s
a970: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d  qlite3OsClose(&m
a980: 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  aster);.  }.  re
a990: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20  turn rc;.}..#if 
a9a0: 30 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  0./*.** Make eve
a9b0: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
a9c0: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
a9d0: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
a9e0: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
a9f0: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
aa00: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
aa10: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
aa20: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
aa30: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
aa40: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
aa50: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
aa60: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
aa70: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
aa80: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
aa90: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
aaa0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
aab0: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
aac0: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
aad0: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
aae0: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
aaf0: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
ab00: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
ab10: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
ab20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
ab30: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
ab40: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
ab50: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
ab60: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ab70: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
ab80: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
ab90: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
aba0: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  All){.    char *
abb0: 7a 42 75 66 20 3d 20 70 50 61 67 65 72 2d 3e 70  zBuf = pPager->p
abc0: 54 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20  TmpSpace;       
abd0: 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65   /* Temp storage
abe0: 20 66 6f 72 20 6f 6e 65 20 70 61 67 65 20 2a 2f   for one page */
abf0: 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 64  .    if( !pPg->d
ac00: 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b  irty ) continue;
ac10: 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50  .    if( (int)pP
ac20: 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
ac30: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
ac40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
ac50: 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72  te3OsSeek(pPager
ac60: 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61  ->fd, pPager->pa
ac70: 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67  geSize*(i64)(pPg
ac80: 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20  ->pgno-1));.    
ac90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
aca0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
acb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
acc0: 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42  d(pPager->fd, zB
acd0: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
ace0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
acf0: 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
ad00: 28 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67  ("REFETCH %d pag
ad10: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
ad20: 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
ad30: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
ad40: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
ad50: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
ad60: 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f   zBuf, pPg->pgno
ad70: 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 2);.    }else{
ad80: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42  .      memset(zB
ad90: 75 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  uf, 0, pPager->p
ada0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
adb0: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
adc0: 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a  f==0 || memcmp(z
add0: 42 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  Buf, PGHDR_TO_DA
ade0: 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
adf0: 3e 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20  >pageSize) ){.  
ae00: 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
ae10: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a  _TO_DATA(pPg), z
ae20: 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Buf, pPager->pag
ae30: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66  eSize);.      if
ae40: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
ae50: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ter ){.        p
ae60: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
ae70: 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61  (pPg, pPager->pa
ae80: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
ae90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65  else{.        me
aea0: 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
aeb0: 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
aec0: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
aed0: 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tra);.      }.  
aee0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65    }.    pPg->nee
aef0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70  dSync = 0;.    p
af00: 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  Pg->dirty = 0;.#
af10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
af20: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
af30: 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
af40: 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
af50: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
af60: 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
af70: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
af80: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
af90: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
afa0: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
afb0: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
afc0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
afd0: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a  .** indicated..*
afe0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
aff0: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
b000: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
b010: 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Page){.  assert(
b020: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
b030: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
b040: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
b050: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
b060: 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
b070: 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29  ->pageSize*(i64)
b080: 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nPage);.}../*.**
b090: 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f   Playback the jo
b0a0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72  urnal and thus r
b0b0: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
b0c0: 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74  ase file to.** t
b0d0: 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20  he state it was 
b0e0: 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61  in before we sta
b0f0: 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e  rted making chan
b100: 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65  ges.  .**.** The
b110: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
b120: 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f  rmat is as follo
b130: 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20  ws: .**.**  (1) 
b140: 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20   8 byte prefix. 
b150: 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72   A copy of aJour
b160: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20  nalMagic[]..**  
b170: 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (2)  4 byte big-
b180: 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
b190: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
b1a0: 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65  er of valid page
b1b0: 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20   records.**     
b1c0: 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c    in the journal
b1d0: 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65  .  If this value
b1e0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
b1f0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65  then compute the
b200: 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72  .**       number
b210: 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73   of page records
b220: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
b230: 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20  l size..**  (3) 
b240: 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
b250: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
b260: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
b270: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a  value for the .*
b280: 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63  *       sanity c
b290: 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29  hecksum..**  (4)
b2a0: 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72    4 byte integer
b2b0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
b2c0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
b2d0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a   truncate the.**
b2e0: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
b2f0: 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c  to during a roll
b300: 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34  back..**  (5)  4
b310: 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68   byte integer wh
b320: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
b330: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  r of bytes in th
b340: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
b350: 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20  .**       name. 
b360: 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62   The value may b
b370: 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65  e zero (indicate
b380: 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e   that there is n
b390: 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  o master.**     
b3a0: 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20    journal.).**  
b3b0: 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20  (6)  N bytes of 
b3c0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b3d0: 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61  al name.  The na
b3e0: 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74  me will be nul-t
b3f0: 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20  erminated.**    
b400: 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20     and might be 
b410: 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65  shorter than the
b420: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
b430: 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69   (5).  If the fi
b440: 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20  rst byte.**     
b450: 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73    of the name is
b460: 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65   \000 then there
b470: 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   is no master jo
b480: 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74  urnal.  The mast
b490: 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72  er.**       jour
b4a0: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72  nal name is stor
b4b0: 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20  ed in UTF-8..** 
b4c0: 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f   (7)  Zero or mo
b4d0: 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63  re pages instanc
b4e0: 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c  es, each as foll
b4f0: 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ows:.**        +
b500: 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75    4 byte page nu
b510: 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20  mber..**        
b520: 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  +  pPager->pageS
b530: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
b540: 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  a..**        +  
b550: 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a  4 byte checksum.
b560: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70  **.** When we sp
b570: 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  eak of the journ
b580: 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65  al header, we me
b590: 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69  an the first 6 i
b5a0: 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45  tems above..** E
b5b0: 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ach entry in the
b5c0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69   journal is an i
b5d0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37  nstance of the 7
b5e0: 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43  th item..**.** C
b5f0: 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72  all the value fr
b600: 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75  om the second bu
b610: 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52  llet "nRec".  nR
b620: 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ec is the number
b630: 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67   of.** valid pag
b640: 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  e entries in the
b650: 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f   journal.  In mo
b660: 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61  st cases, you ca
b670: 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a  n compute the.**
b680: 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66   value of nRec f
b690: 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
b6a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b6b0: 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65  .  But if a powe
b6c0: 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63  r.** failure occ
b6d0: 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20  urred while the 
b6e0: 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
b6f0: 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f  g written, it co
b700: 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61  uld be the.** ca
b710: 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  se that the size
b720: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
b730: 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79  file had already
b740: 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20   been increased 
b750: 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61  but.** the extra
b760: 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74   entries had not
b770: 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66   yet made it saf
b780: 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e  ely to disk.  In
b790: 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a   such a case,.**
b7a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52   the value of nR
b7b0: 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d  ec computed from
b7c0: 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77   the file size w
b7d0: 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67  ould be too larg
b7e0: 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20  e.  For.** that 
b7f0: 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79  reason, we alway
b800: 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76  s use the nRec v
b810: 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64  alue in the head
b820: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  er..**.** If the
b830: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30   nRec value is 0
b840: 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61  xffffffff it mea
b850: 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f  ns that nRec sho
b860: 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a  uld be computed.
b870: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ** from the file
b880: 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c   size.  This val
b890: 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  ue is used when 
b8a0: 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73  the user selects
b8b0: 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20   the.** no-sync 
b8c0: 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a  option for the j
b8d0: 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72  ournal.  A power
b8e0: 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
b8f0: 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f  ead to corruptio
b900: 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  n.** in this cas
b910: 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e  e.  But for thin
b920: 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72  gs like temporar
b930: 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77  y table (which w
b940: 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65  ill be.** delete
b950: 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72  d when the power
b960: 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65   is restored) we
b970: 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a   don't care.  .*
b980: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65  *.** If the file
b990: 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a   opened as the j
b9a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
b9b0: 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  ot a well-formed
b9c0: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
b9d0: 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   then all pages 
b9e0: 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  up to the first 
b9f0: 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61  corrupted page a
ba00: 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  re rolled.** bac
ba10: 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69  k (or no pages i
ba20: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ba30: 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65  ader is corrupte
ba40: 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  d). The journal 
ba50: 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20  file.** is then 
ba60: 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49  deleted and SQLI
ba70: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20  TE_OK returned, 
ba80: 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f  just as if no co
ba90: 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20  rruption had.** 
baa0: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
bab0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f  ..**.** If an I/
bac0: 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72  O or malloc() er
bad0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20  ror occurs, the 
bae0: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20  journal-file is 
baf0: 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61  not deleted.** a
bb00: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
bb10: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
bb20: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
bb30: 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  r_playback(Pager
bb40: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
bb50: 48 6f 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  Hot){.  i64 szJ;
bb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb70: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
bb80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
bb90: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
bba0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
bbb0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bbc0: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
bbd0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
bbe0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
bbf0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bc00: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
bc10: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
bc20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
bc30: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
bc40: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
bc50: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
bc60: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
bc70: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
bc80: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
bc90: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
bca0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
bcb0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
bcc0: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
bcd0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
bce0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
bcf0: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
bd00: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
bd10: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
bd20: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
bd30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
bd40: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
bd50: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
bd60: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
bd70: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29  ager->jfd, &szJ)
bd80: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
bd90: 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20  TE_OK || szJ==0 
bda0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
bdb0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20  playback;.  }.. 
bdc0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73   /* Read the mas
bdd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
bde0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
bdf0: 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73  l, if it is pres
be00: 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d  ent..  ** If a m
be10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
be20: 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69  le name is speci
be30: 66 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69  fied, but the fi
be40: 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70  le is not.  ** p
be50: 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20  resent on disk, 
be60: 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
be70: 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20   is not hot and 
be80: 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
be90: 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20   be.  ** played 
bea0: 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
beb0: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
bec0: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
bed0: 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73   &zMaster);.  as
bee0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
bef0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72  _DONE );.  if( r
bf00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
bf10: 28 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c  (zMaster && !sql
bf20: 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
bf30: 28 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20  (zMaster)) ){.  
bf40: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
bf50: 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
bf60: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
bf70: 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
bf80: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ) rc = SQLITE_OK
bf90: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
bfa0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73  layback;.  }.  s
bfb0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61  qlite3OsSeek(pPa
bfc0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
bfd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bfe0: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
bff0: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
c000: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
c010: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
c020: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
c030: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
c040: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
c050: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
c060: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
c070: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
c080: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
c090: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
c0a0: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
c0b0: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
c0c0: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
c0d0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
c0e0: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
c0f0: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
c100: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
c110: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
c120: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
c130: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
c140: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
c150: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
c160: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
c170: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
c180: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
c190: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
c1a0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
c1b0: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
c1c0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c1d0: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
c1e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
c1f0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
c200: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c210: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
c220: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
c230: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
c240: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
c250: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
c260: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
c270: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
c280: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
c290: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
c2a0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
c2b0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
c2c0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
c2d0: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
c2e0: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
c2f0: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
c300: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
c310: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
c320: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
c330: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
c340: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
c350: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
c360: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
c370: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
c380: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
c390: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
c3a0: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
c3b0: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
c3c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
c3d0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
c3e0: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
c3f0: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
c400: 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
c410: 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
c420: 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
c430: 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
c440: 63 65 73 73 2e 20 49 6e 20 74 68 69 73 20 63 61  cess. In this ca
c450: 73 65 20 74 68 65 20 72 65 73 74 20 6f 66 20 74  se the rest of t
c460: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c470: 63 6f 6e 73 69 73 74 73 20 6f 66 0a 20 20 20 20  consists of.    
c480: 2a 2a 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 63 6f  ** journalled co
c490: 70 69 65 73 20 6f 66 20 70 61 67 65 73 20 74 68  pies of pages th
c4a0: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 65  at need to be re
c4b0: 61 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  ad back into the
c4c0: 20 63 61 63 68 65 2e 0a 20 20 20 20 2a 2f 0a 20   cache..    */. 
c4d0: 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26     if( nRec==0 &
c4e0: 26 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20  & !isHot ){.    
c4f0: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
c500: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c510: 66 66 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47  ff) / JOURNAL_PG
c520: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20  _SZ(pPager);.   
c530: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
c540: 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
c550: 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f 6d  header read from
c560: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 72   the journal, tr
c570: 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20 2a  uncate the.    *
c580: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
c590: 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72 69  back to it's ori
c5a0: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20 20  ginal size..    
c5b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  */.    if( pPage
c5c0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
c5d0: 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20 20  EXCLUSIVE && .  
c5e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
c5f0: 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
c600: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
c610: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
c620: 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  ( pPager->origDb
c630: 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  Size==0 || pPage
c640: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d  r->origDbSize==m
c650: 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63 20  xPg );.      rc 
c660: 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
c670: 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a  (pPager, mxPg);.
c680: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
c690: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c6a0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
c6b0: 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  back;.      }.  
c6c0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
c6d0: 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d  ze = mxPg;.    }
c6e0: 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72  ..    /* Copy or
c6f0: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
c700: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c710: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c720: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
c730: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
c740: 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b  i=0; i<nRec; i++
c750: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c760: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c770: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  _page(pPager, pP
c780: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
c790: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c7a0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
c7b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
c7c0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
c7d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
c7e0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
c7f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c800: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
c810: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
c820: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c830: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c840: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
c850: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
c860: 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f    /*NOTREACHED*/
c870: 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a  .  assert( 0 );.
c880: 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20  .end_playback:. 
c890: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
c8a0: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  OK ){.    rc = p
c8b0: 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
c8c0: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
c8d0: 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20  if( zMaster ){. 
c8e0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
c8f0: 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
c900: 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
c910: 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
c920: 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65   true,.    ** se
c930: 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  e if it is possi
c940: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
c950: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
c960: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c970: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
c980: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
c990: 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61  er_delmaster(zMa
c9a0: 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ster);.    }.   
c9b0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
c9c0: 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter);.  }..  /* 
c9d0: 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
c9e0: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
c9f0: 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
ca00: 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
ca10: 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
ca20: 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
ca30: 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
ca40: 61 20 64 69 66 66 65 72 65 6e 74 20 50 41 47 45  a different PAGE
ca50: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  R_SECTOR_SIZE.  
ca60: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
ca70: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
ca80: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
ca90: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
caa0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
cab0: 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
cac0: 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
cad0: 2d 3e 66 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  ->fd);.  return 
cae0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
caf0: 79 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d  yback the statem
cb00: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
cb10: 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c  ** This is simil
cb20: 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61  ar to playing ba
cb30: 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ck the transacti
cb40: 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77  on journal but w
cb50: 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74  ith.** a few ext
cb60: 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a  ra twists..**.**
cb70: 20 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d      (1)  The num
cb80: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
cb90: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
cba0: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
cbb0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65  f.**         the
cbc0: 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74   statement is st
cbd0: 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e  ored in pPager->
cbe0: 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e  stmtSize, not in
cbf0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
cc00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73  journal file its
cc10: 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  elf..**.**    (2
cc20: 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74  )  In addition t
cc30: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
cc40: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
cc50: 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20  rnal, also.**   
cc60: 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61        playback a
cc70: 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ll pages of the 
cc80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
cc90: 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a  nal beginning.**
cca0: 20 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73           at offs
ccb0: 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  et pPager->stmtJ
ccc0: 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Size..*/.static 
ccd0: 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  int pager_stmt_p
cce0: 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
ccf0: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a  Pager){.  i64 sz
cd00: 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  J;              
cd10: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
cd20: 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a  e full journal *
cd30: 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a  /.  i64 hdrOff;.
cd40: 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20    int nRec;     
cd50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
cd60: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
cd70: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cd90: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
cda0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a  .  int rc;..  sz
cdb0: 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J = pPager->jour
cdc0: 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20  nalOff;.#ifndef 
cdd0: 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20  NDEBUG .  {.    
cde0: 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20  i64 os_szJ;.    
cdf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
ce00: 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
ce10: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
ce20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ce30: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
ce40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
ce50: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
ce60: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
ce70: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
ce80: 65 20 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66  e offset just af
ce90: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
cea0: 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a  he last journal.
ceb0: 20 20 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65    ** page writte
cec0: 6e 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  n before the fir
ced0: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
cee0: 72 20 66 6f 72 20 74 68 69 73 20 73 74 61 74 65  r for this state
cef0: 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61  ment.  ** transa
cf00: 63 74 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65  ction was writte
cf10: 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66  n, or the end of
cf20: 20 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20   the file if no 
cf30: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61  journal.  ** hea
cf40: 64 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e  der was written.
cf50: 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d  .  */.  hdrOff =
cf60: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
cf70: 4f 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Off;.  assert( p
cf80: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
cf90: 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20  || !hdrOff );.  
cfa0: 69 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20  if( !hdrOff ){. 
cfb0: 20 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b     hdrOff = szJ;
cfc0: 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75  .  }.  .  /* Tru
cfd0: 6e 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61  ncate the databa
cfe0: 73 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  se back to its o
cff0: 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
d000: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
d010: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
d020: 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72  CLUSIVE ){.    r
d030: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
d040: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
d050: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
d060: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
d070: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
d080: 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 70 50 61  _SHARED );.  pPa
d090: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
d0a0: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a  ager->stmtSize;.
d0b0: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
d0c0: 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
d0d0: 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  s are in the sta
d0e0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
d0f0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d100: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
d110: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
d120: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c  nalOpen );.  sql
d130: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
d140: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e  r->stfd, 0);.  n
d150: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
d160: 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
d170: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
d180: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
d190: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d1a0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
d1b0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d1c0: 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
d1d0: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
d1e0: 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
d1f0: 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
d200: 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
d210: 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
d220: 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
d230: 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
d240: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
d250: 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
d260: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
d270: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
d280: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
d290: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
d2a0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  , pPager->stfd, 
d2b0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
d2c0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d2d0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
d2e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
d2f0: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
d300: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  k;.  }..  /* Now
d310: 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73   roll some pages
d320: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74   back from the t
d330: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
d340: 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53  al. Pager.stmtJS
d350: 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65  ize.  ** was the
d360: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
d370: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74  rnal file when t
d380: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61  his statement wa
d390: 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20  s started, so.  
d3a0: 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66  ** everything af
d3b0: 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74  ter that needs t
d3c0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
d3d0: 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  , either into th
d3e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
d3f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68   the memory cach
d400: 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  e, or both..  **
d410: 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  .  ** If it is n
d420: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61  ot zero, then Pa
d430: 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69  ger.stmtHdrOff i
d440: 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  s the offset to 
d450: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
d460: 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  f the first jour
d470: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
d480: 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73  en during this s
d490: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
d4a0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
d4b0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
d4c0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
d4d0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
d4e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d4f0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
d500: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d510: 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
d520: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
d530: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
d540: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  ;.  pPager->cksu
d550: 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  mInit = pPager->
d560: 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69  stmtCksum;.  whi
d570: 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
d580: 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20  nalOff < hdrOff 
d590: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
d5a0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
d5b0: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
d5c0: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
d5d0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d5e0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d5f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d600: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
d610: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
d620: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
d630: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
d640: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 4a  zJ ){.    u32 nJ
d650: 52 65 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  Rec;         /* 
d660: 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75 72 6e 61  Number of Journa
d670: 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 20  l Records */.   
d680: 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
d690: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
d6a0: 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c  Hdr(pPager, szJ,
d6b0: 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d 6d 79 29   &nJRec, &dummy)
d6c0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
d6d0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
d6e0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
d6f0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
d700: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
d710: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
d720: 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30      if( nJRec==0
d730: 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52 65 63 20   ){.      nJRec 
d740: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
d750: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
d760: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d770: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
d780: 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e  or(i=nJRec-1; i>
d790: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
d7a0: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
d7b0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
d7c0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d7d0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
d7e0: 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29   pPager->jfd, 1)
d7f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d800: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
d810: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
d820: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
d830: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
d840: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
d850: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
d860: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
d870: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
d880: 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
d890: 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61  TE_OK) {.    pPa
d8a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
d8b0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
d8c0: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
d8d0: 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
d8e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d8f0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
d900: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
d910: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
d920: 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
d930: 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
d940: 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
d950: 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
d960: 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
d970: 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
d980: 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
d990: 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
d9a0: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
d9b0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
d9c0: 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
d9d0: 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
d9e0: 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
d9f0: 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
da00: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
da10: 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
da20: 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
da30: 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
da40: 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
da50: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
da60: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
da70: 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
da80: 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
da90: 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
daa0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
dab0: 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
dac0: 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
dad0: 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
dae0: 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
daf0: 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
db00: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
db10: 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
db20: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
db30: 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
db40: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
db50: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
db60: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
db70: 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
db80: 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
db90: 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
dba0: 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
dbb0: 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
dbc0: 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
dbd0: 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
dbe0: 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
dbf0: 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
dc00: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
dc10: 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
dc20: 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
dc30: 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
dc40: 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
dc50: 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
dc60: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
dc70: 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
dc80: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
dc90: 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
dca0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
dcb0: 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
dcc0: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
dcd0: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
dce0: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
dcf0: 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
dd00: 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
dd10: 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
dd20: 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
dd30: 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
dd40: 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
dd50: 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
dd60: 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
dd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
dd80: 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
dd90: 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
dda0: 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
ddb0: 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
ddc0: 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
ddd0: 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
dde0: 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
ddf0: 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
de00: 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
de10: 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
de20: 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
de30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
de40: 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
de50: 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
de60: 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
de70: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
de80: 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
de90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
dea0: 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
deb0: 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
dec0: 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
ded0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
dee0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
def0: 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
df00: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
df10: 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
df20: 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
df30: 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a  nt full_fsync){.
df40: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
df50: 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
df60: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
df70: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
df80: 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
df90: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
dfa0: 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
dfb0: 66 75 6c 6c 5f 66 73 79 6e 63 20 3d 20 66 75 6c  full_fsync = ful
dfc0: 6c 5f 66 73 79 6e 63 3b 0a 20 20 69 66 28 20 70  l_fsync;.  if( p
dfd0: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20  Pager->noSync ) 
dfe0: 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
dff0: 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a   = 0;.}.#endif..
e000: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
e010: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
e020: 62 6c 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ble is increment
e030: 65 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20  ed whenever the 
e040: 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d  library.** attem
e050: 70 74 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65  pts to open a te
e060: 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54  mporary file.  T
e070: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
e080: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
e090: 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
e0a0: 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23  sis only.  .*/.#
e0b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
e0c0: 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  T.int sqlite3_op
e0d0: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30  entemp_count = 0
e0e0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
e0f0: 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79  Open a temporary
e100: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72   file. .**.** Wr
e110: 69 74 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ite the file des
e120: 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64  criptor into *fd
e130: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
e140: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
e150: 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20  r some.** other 
e160: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
e170: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   fail..**.** The
e180: 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
e190: 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
e1a0: 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  e temporary file
e1b0: 20 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63   when it is.** c
e1c0: 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
e1d0: 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65   int sqlite3Page
e1e0: 72 4f 70 65 6e 74 65 6d 70 28 4f 73 46 69 6c 65  rOpentemp(OsFile
e1f0: 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20 63   **pFd){.  int c
e200: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
e210: 3b 0a 20 20 63 68 61 72 20 7a 46 69 6c 65 5b 53  ;.  char zFile[S
e220: 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53  QLITE_TEMPNAME_S
e230: 49 5a 45 5d 3b 0a 0a 23 69 66 64 65 66 20 53 51  IZE];..#ifdef SQ
e240: 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
e250: 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
e260: 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64 20 66  nt++;  /* Used f
e270: 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  or testing and a
e280: 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a  nalysis only */.
e290: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 0a 20 20 20  #endif.  do{.   
e2a0: 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69   cnt--;.    sqli
e2b0: 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d  te3OsTempFileNam
e2c0: 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72 63  e(zFile);.    rc
e2d0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
e2e0: 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c  Exclusive(zFile,
e2f0: 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69   pFd, 1);.  }whi
e300: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
e310: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
e320: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
e330: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e340: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
e350: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
e360: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
e370: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
e380: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
e390: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
e3a0: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
e3b0: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
e3c0: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
e3d0: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
e3e0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
e3f0: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
e400: 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
e410: 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
e420: 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
e430: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
e440: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
e450: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
e460: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
e470: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
e480: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
e490: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
e4a0: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
e4b0: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
e4c0: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
e4d0: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
e4e0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
e4f0: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
e500: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
e510: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
e520: 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
e530: 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
e540: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
e550: 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
e560: 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
e570: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
e580: 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
e590: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
e5a0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
e5b0: 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61  3PagerOpen(.  Pa
e5c0: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
e5d0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
e5e0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
e5f0: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
e600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
e610: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
e620: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
e630: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
e640: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
e650: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
e660: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
e670: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
e680: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
e690: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
e6a0: 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
e6b0: 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
e6c0: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  file */.){.  Pag
e6d0: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a  er *pPager = 0;.
e6e0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
e6f0: 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
e700: 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f   nameLen;  /* Co
e710: 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e  mpiler is wrong.
e720: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
e730: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f  initialized befo
e740: 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69  re use */.  OsFi
e750: 6c 65 20 2a 66 64 3b 0a 20 20 69 6e 74 20 72 63  le *fd;.  int rc
e760: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e770: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d  int i;.  int tem
e780: 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  pFile = 0;.  int
e790: 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e   memDb = 0;.  in
e7a0: 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  t readOnly = 0;.
e7b0: 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
e7c0: 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
e7d0: 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
e7e0: 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64  =0;.  int noRead
e7f0: 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20  lock = (flags & 
e800: 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43  PAGER_NO_READLOC
e810: 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54  K)!=0;.  char zT
e820: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
e830: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23 69 66 64 65  AME_SIZE];.#ifde
e840: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
e850: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
e860: 54 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28  T.  /* A malloc(
e870: 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e  ) cannot fail in
e880: 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61   sqlite3ThreadDa
e890: 74 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d  ta() as one or m
e8a0: 6f 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20  ore calls to .  
e8b0: 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74  ** malloc() must
e8c0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
e8d0: 65 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20  en made by this 
e8e0: 74 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74  thread before it
e8f0: 20 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68   gets.  ** to th
e900: 69 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d  is point. This m
e910: 65 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44  eans the ThreadD
e920: 61 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65  ata must have be
e930: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72  en allocated alr
e940: 65 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61  eady.  ** so tha
e950: 74 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c  t ThreadData.nAl
e960: 6c 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 20  loc can be set. 
e970: 49 74 20 77 6f 75 6c 64 20 62 65 20 6e 69 63 65  It would be nice
e980: 20 74 6f 20 61 73 73 65 72 74 0a 20 20 2a 2a 20   to assert.  ** 
e990: 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61 2e  that ThreadData.
e9a0: 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f 6e 2d 7a 65  nAlloc is non-ze
e9b0: 72 6f 2c 20 62 75 74 20 61 6c 61 73 20 74 68 69  ro, but alas thi
e9c0: 73 20 62 72 65 61 6b 73 20 74 65 73 74 20 63 61  s breaks test ca
e9d0: 73 65 73 20 0a 20 20 2a 2a 20 77 72 69 74 74 65  ses .  ** writte
e9e0: 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20  n to invoke the 
e9f0: 70 61 67 65 72 20 64 69 72 65 63 74 6c 79 2e 0a  pager directly..
ea00: 20 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74    */.  ThreadDat
ea10: 61 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65  a *pTsd = sqlite
ea20: 33 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20  3ThreadData();. 
ea30: 20 61 73 73 65 72 74 28 20 70 54 73 64 20 29 3b   assert( pTsd );
ea40: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
ea50: 20 6d 61 6c 6c 6f 63 28 29 20 68 61 73 20 61 6c   malloc() has al
ea60: 72 65 61 64 79 20 66 61 69 6c 65 64 20 72 65 74  ready failed ret
ea70: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
ea80: 2e 20 42 65 66 6f 72 65 20 65 76 65 6e 0a 20 20  . Before even.  
ea90: 2a 2a 20 74 65 73 74 69 6e 67 20 66 6f 72 20 74  ** testing for t
eaa0: 68 69 73 2c 20 73 65 74 20 2a 70 70 50 61 67 65  his, set *ppPage
eab0: 72 20 74 6f 20 4e 55 4c 4c 20 73 6f 20 74 68 65  r to NULL so the
eac0: 20 63 61 6c 6c 65 72 20 6b 6e 6f 77 73 20 74 68   caller knows th
ead0: 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 73 74 72  e pager.  ** str
eae0: 75 63 74 75 72 65 20 77 61 73 20 6e 65 76 65 72  ucture was never
eaf0: 20 61 6c 6c 6f 63 61 74 65 64 2e 20 0a 20 20 2a   allocated. .  *
eb00: 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
eb10: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d  ;.  if( sqlite3M
eb20: 61 6c 6c 6f 63 46 61 69 6c 65 64 28 29 20 29 7b  allocFailed() ){
eb30: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
eb40: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
eb50: 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73  memset(&fd, 0, s
eb60: 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f  izeof(fd));..  /
eb70: 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
eb80: 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46   file and set zF
eb90: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70  ullPathname to p
eba0: 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29  oint at malloc()
ebb0: 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  ed .  ** memory 
ebc0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
ebd0: 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65  omplete filename
ebe0: 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67   (i.e. including
ebf0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e   the directory).
ec00: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
ec10: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
ec20: 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
ec30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
ec40: 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
ec50: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
ec60: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
ec70: 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
ec80: 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  ;.      zFullPat
ec90: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  hname = sqliteSt
eca0: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65  rDup("");.    }e
ecb0: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
ecc0: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
ecd0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
ece0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
ecf0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
ed00: 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  f( zFullPathname
ed10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ed20: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
ed30: 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74  adWrite(zFullPat
ed40: 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  hname, &fd, &rea
ed50: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a  dOnly);.      }.
ed60: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
ed70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
ed80: 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26 66 64  agerOpentemp(&fd
ed90: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
eda0: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 54 65  TempFileName(zTe
edb0: 6d 70 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  mp);.    zFilena
edc0: 6d 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  me = zTemp;.    
edd0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
ede0: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
edf0: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
ee00: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
ee10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
ee20: 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20   tempFile = 1;. 
ee30: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
ee40: 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
ee50: 72 20 73 74 72 75 63 74 75 72 65 2e 20 41 73 20  r structure. As 
ee60: 70 61 72 74 20 6f 66 20 74 68 65 20 73 61 6d 65  part of the same
ee70: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 20 61 6c 6c   allocation, all
ee80: 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65  ocate.  ** space
ee90: 20 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 70 61   for the full pa
eea0: 74 68 73 20 6f 66 20 74 68 65 20 66 69 6c 65 2c  ths of the file,
eeb0: 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 6a   directory and j
eec0: 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 28 50 61  ournal .  ** (Pa
eed0: 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 2c 20 50  ger.zFilename, P
eee0: 61 67 65 72 2e 7a 44 69 72 65 63 74 6f 72 79 20  ager.zDirectory 
eef0: 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
ef00: 61 6c 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  al)..  */.  if( 
ef10: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b  zFullPathname ){
ef20: 0a 20 20 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73  .    nameLen = s
ef30: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
ef40: 61 6d 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ame);.    pPager
ef50: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
ef60: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
ef70: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33   + nameLen*3 + 3
ef80: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
ef90: 67 65 72 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ger && rc==SQLIT
efa0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
efb0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20  ager->pTmpSpace 
efc0: 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
efd0: 4d 61 6c 6c 6f 63 52 61 77 28 53 51 4c 49 54 45  MallocRaw(SQLITE
efe0: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
eff0: 5a 45 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ZE);.    }.  }..
f000: 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
f010: 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
f020: 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
f030: 73 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68  s above, free th
f040: 65 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70  e memory .  ** p
f050: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75  ointed to by zFu
f060: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65  llPathname, free
f070: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
f080: 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
f090: 68 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53  he .  ** file. S
f0a0: 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
f0b0: 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
f0c0: 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
f0d0: 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
f0e0: 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
f0f0: 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
f100: 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
f110: 20 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   !zFullPathname 
f120: 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  || !pPager->pTmp
f130: 53 70 61 63 65 20 7c 7c 20 72 63 21 3d 53 51 4c  Space || rc!=SQL
f140: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
f150: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
f160: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
f170: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
f180: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
f190: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
f1a0: 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
f1b0: 45 5f 4f 4b 29 3f 53 51 4c 49 54 45 5f 4e 4f 4d  E_OK)?SQLITE_NOM
f1c0: 45 4d 3a 72 63 29 3b 0a 20 20 7d 0a 0a 20 20 50  EM:rc);.  }..  P
f1d0: 41 47 45 52 54 52 41 43 45 33 28 22 4f 50 45 4e  AGERTRACE3("OPEN
f1e0: 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48   %d %s\n", FILEH
f1f0: 41 4e 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75  ANDLEID(fd), zFu
f200: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 49  llPathname);.  I
f210: 4f 54 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70  OTRACE(("OPEN %p
f220: 20 25 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %s\n", pPager, 
f230: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 29 0a  zFullPathname)).
f240: 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
f250: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 50  ame = (char*)&pP
f260: 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67 65  ager[1];.  pPage
f270: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20  r->zDirectory = 
f280: 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  &pPager->zFilena
f290: 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  me[nameLen+1];. 
f2a0: 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
f2b0: 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
f2c0: 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e 2b  rectory[nameLen+
f2d0: 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  1];.  strcpy(pPa
f2e0: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
f2f0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
f300: 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d    strcpy(pPager-
f310: 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46 75  >zDirectory, zFu
f320: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20  llPathname);..  
f330: 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69  for(i=nameLen; i
f340: 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44  >0 && pPager->zD
f350: 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27  irectory[i-1]!='
f360: 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28  /'; i--){}.  if(
f370: 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a   i>0 ) pPager->z
f380: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d  Directory[i-1] =
f390: 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61   0;.  strcpy(pPa
f3a0: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a  ger->zJournal, z
f3b0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
f3c0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
f3d0: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74  lPathname);.  st
f3e0: 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  rcpy(&pPager->zJ
f3f0: 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d 2c  ournal[nameLen],
f400: 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20   "-journal");.  
f410: 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64 3b  pPager->fd = fd;
f420: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
f430: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
f440: 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
f450: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
f460: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
f470: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
f480: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
f490: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
f4a0: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
f4b0: 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
f4c0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
f4d0: 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
f4e0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
f4f0: 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
f500: 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
f510: 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
f520: 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
f530: 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a  AULT_PAGE_SIZE;.
f540: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
f550: 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20  tSize = 0; */.  
f560: 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  /* pPager->stmtJ
f570: 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  Size = 0; */.  /
f580: 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20  * pPager->nPage 
f590: 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
f5a0: 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20  ger->nMaxPage = 
f5b0: 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
f5c0: 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20 20  mxPage = 100;.  
f5d0: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 55 4e  assert( PAGER_UN
f5e0: 4c 4f 43 4b 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20  LOCK==0 );.  /* 
f5f0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
f600: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f  PAGER_UNLOCK; */
f610: 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72  .  /* pPager->er
f620: 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20  rMask = 0; */.  
f630: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
f640: 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70   = tempFile;.  p
f650: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d  Pager->memDb = m
f660: 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e  emDb;.  pPager->
f670: 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f  readOnly = readO
f680: 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  nly;.  /* pPager
f690: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20  ->needSync = 0; 
f6a0: 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  */.  pPager->noS
f6b0: 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65  ync = pPager->te
f6c0: 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f  mpFile || !useJo
f6d0: 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d  urnal;.  pPager-
f6e0: 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61  >fullSync = (pPa
f6f0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29  ger->noSync?0:1)
f700: 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  ;.  /* pPager->p
f710: 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  First = 0; */.  
f720: 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  /* pPager->pFirs
f730: 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a  tSynced = 0; */.
f740: 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61    /* pPager->pLa
f750: 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  st = 0; */.  pPa
f760: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
f770: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
f780: 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74 28  xtra);.  assert(
f790: 66 64 7c 7c 6d 65 6d 44 62 29 3b 0a 20 20 69 66  fd||memDb);.  if
f7a0: 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  ( !memDb ){.    
f7b0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
f7c0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
f7d0: 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20  ctorSize(fd);.  
f7e0: 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  }.  /* pPager->p
f7f0: 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b  BusyHandler = 0;
f800: 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65 74 28   */.  /* memset(
f810: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30  pPager->aHash, 0
f820: 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  , sizeof(pPager-
f830: 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20 20 2a  >aHash)); */.  *
f840: 70 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  ppPager = pPager
f850: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f860: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
f870: 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61 67 65  NAGEMENT.  pPage
f880: 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54 73 64 2d  r->pNext = pTsd-
f890: 3e 70 50 61 67 65 72 3b 0a 20 20 70 54 73 64 2d  >pPager;.  pTsd-
f8a0: 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
f8b0: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
f8c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f8d0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
f8e0: 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
f8f0: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
f900: 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
f910: 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70  handler(Pager *p
f920: 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c  Pager, BusyHandl
f930: 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
f940: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  ){.  pPager->pBu
f950: 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73  syHandler = pBus
f960: 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a  yHandler;.}../*.
f970: 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
f980: 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
f990: 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
f9a0: 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
f9b0: 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
f9c0: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
f9d0: 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
f9e0: 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
f9f0: 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
fa00: 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
fa10: 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
fa20: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
fa30: 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
fa40: 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
fa50: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
fa60: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
fa70: 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
fa80: 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67  esult sqlite3Pag
fa90: 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  erClose().  .** 
faa0: 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
fab0: 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
fac0: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
fad0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
fae0: 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
faf0: 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
fb00: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
fb10: 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  c)(DbPage*,int))
fb20: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
fb30: 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
fb40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
fb50: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
fb60: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
fb70: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
fb80: 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
fb90: 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
fba0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
fbb0: 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
fbc0: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
fbd0: 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
fbe0: 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
fbf0: 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
fc00: 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
fc10: 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
fc20: 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
fc30: 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
fc40: 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
fc50: 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
fc60: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
fc70: 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
fc80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
fc90: 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50  gerSetReiniter(P
fca0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
fcb0: 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
fcc0: 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
fcd0: 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
fce0: 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
fcf0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
fd00: 65 20 73 69 7a 65 2e 20 20 52 65 74 75 72 6e 20  e size.  Return 
fd10: 74 68 65 20 6e 65 77 20 73 69 7a 65 2e 20 20 49  the new size.  I
fd20: 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
fd30: 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 69  w page.** size i
fd40: 73 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  s inappropriate,
fd50: 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
fd60: 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
fd70: 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a 20 61 6e  s selected.** an
fd80: 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  d returned..*/.i
fd90: 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
fda0: 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
fdb0: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 70 61   *pPager, int pa
fdc0: 67 65 53 69 7a 65 29 7b 0a 20 20 61 73 73 65 72  geSize){.  asser
fdd0: 74 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t( pageSize>=512
fde0: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
fdf0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
fe00: 5a 45 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ZE );.  if( !pPa
fe10: 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70 50  ger->memDb && pP
fe20: 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  ager->nRef==0 ){
fe30: 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
fe40: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
fe50: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
fe60: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 73   pageSize;.    s
fe70: 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63 4f 72 46  qlite3ReallocOrF
fe80: 72 65 65 28 26 70 50 61 67 65 72 2d 3e 70 54 6d  ree(&pPager->pTm
fe90: 70 53 70 61 63 65 2c 20 70 61 67 65 53 69 7a 65  pSpace, pageSize
fea0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
feb0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
fec0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
fed0: 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20 6f 66 20  ollowing set of 
fee0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
fef0: 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
ff00: 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f   simulated.** I/
ff10: 4f 20 65 72 72 6f 72 20 6d 65 63 68 61 6e 69 73  O error mechanis
ff20: 6d 2e 20 20 54 68 65 73 65 20 72 6f 75 74 69 6e  m.  These routin
ff30: 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 61  es are used to a
ff40: 76 6f 69 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a  void simulated.*
ff50: 2a 20 65 72 72 6f 72 73 20 69 6e 20 70 6c 61 63  * errors in plac
ff60: 65 73 20 77 68 65 72 65 20 77 65 20 64 6f 20 6e  es where we do n
ff70: 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 65 72  ot care about er
ff80: 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65  rors..**.** Unle
ff90: 73 73 20 2d 44 53 51 4c 49 54 45 5f 54 45 53 54  ss -DSQLITE_TEST
ffa0: 3d 31 20 69 73 20 75 73 65 64 2c 20 74 68 65 73  =1 is used, thes
ffb0: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 61  e routines are a
ffc0: 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64  ll no-ops.** and
ffd0: 20 67 65 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64   generate no cod
ffe0: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
fff0: 49 54 45 5f 54 45 53 54 0a 65 78 74 65 72 6e 20  ITE_TEST.extern 
10000 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
10010 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78  rror_pending;.ex
10020 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
10030 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73  _io_error_hit;.s
10040 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 5f  tatic int saved_
10050 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65 61 72 5f  cnt;.void clear_
10060 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
10070 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  or(){.  sqlite3_
10080 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20 3d 20 30  io_error_hit = 0
10090 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61 62 6c 65  ;.}.void disable
100a0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
100b0 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61  rors(void){.  sa
100c0 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  ved_cnt = sqlite
100d0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
100e0 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  ng;.  sqlite3_io
100f0 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
10100 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62   -1;.}.void enab
10110 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
10120 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20  errors(void){.  
10130 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
10140 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64  _pending = saved
10150 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  _cnt;.}.#else.# 
10160 64 65 66 69 6e 65 20 63 6c 65 61 72 5f 73 69 6d  define clear_sim
10170 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 28  ulated_io_error(
10180 29 0a 23 20 64 65 66 69 6e 65 20 64 69 73 61 62  ).# define disab
10190 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
101a0 65 72 72 6f 72 73 28 29 0a 23 20 64 65 66 69 6e  errors().# defin
101b0 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74  e enable_simulat
101c0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
101d0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  endif../*.** Rea
101e0 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79  d the first N by
101f0 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67  tes from the beg
10200 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69  inning of the fi
10210 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a  le into memory.*
10220 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69  * that pDest poi
10230 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a 2a 20 4e  nts to. .**.** N
10240 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
10250 20 69 73 20 64 6f 6e 65 2e 20 54 68 65 20 72 61   is done. The ra
10260 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68 69 73 20  tional for this 
10270 69 73 20 74 68 61 74 20 74 68 69 73 20 66 75 6e  is that this fun
10280 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79 20 62 65  ction .** may be
10290 20 63 61 6c 6c 65 64 20 65 76 65 6e 20 69 66 20   called even if 
102a0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
102b0 74 20 65 78 69 73 74 20 6f 72 20 63 6f 6e 74 61  t exist or conta
102c0 69 6e 20 61 20 68 65 61 64 65 72 2e 20 49 6e 20  in a header. In 
102d0 0a 2a 2a 20 74 68 65 73 65 20 63 61 73 65 73 20  .** these cases 
102e0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 29 20  sqlite3OsRead() 
102f0 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6e 20 65  will return an e
10300 72 72 6f 72 2c 20 74 6f 20 77 68 69 63 68 20 74  rror, to which t
10310 68 65 20 63 6f 72 72 65 63 74 20 0a 2a 2a 20 72  he correct .** r
10320 65 73 70 6f 6e 73 65 20 69 73 20 74 6f 20 7a 65  esponse is to ze
10330 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 74  ro the memory at
10340 20 70 44 65 73 74 20 61 6e 64 20 63 6f 6e 74 69   pDest and conti
10350 6e 75 65 2e 20 20 41 20 72 65 61 6c 20 49 4f 20  nue.  A real IO 
10360 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c 6c 20 70  error .** will p
10370 72 65 73 75 6d 61 62 6c 79 20 72 65 63 75 72 20  resumably recur 
10380 61 6e 64 20 62 65 20 70 69 63 6b 65 64 20 75 70  and be picked up
10390 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a 20 54 68   later (Todo: Th
103a0 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 29 2e  ink about this).
103b0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
103c0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
103d0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
103e0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
103f0 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
10400 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
10410 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
10420 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69  Dest, 0, N);.  i
10430 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20  f( MEMDB==0 ){. 
10440 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
10450 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
10460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
10470 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  eek(pPager->fd, 
10480 30 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73  0);.    enable_s
10490 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
104a0 72 73 28 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  rs();.    IOTRAC
104b0 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25  E(("DBHDR %p 0 %
104c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29  d\n", pPager, N)
104d0 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
104e0 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
104f0 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a  >fd, pDest, N);.
10500 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10510 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
10520 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
10530 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
10540 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10550 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
10560 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
10570 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
10580 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61   the disk file a
10590 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a  ssociated with.*
105a0 2a 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a  * pPager. .**.**
105b0 20 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f   If the PENDING_
105c0 42 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65  BYTE lies on the
105d0 20 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61   page directly a
105e0 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20  fter the end of 
105f0 74 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65  the.** file, the
10600 6e 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20  n consider this 
10610 70 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65  page part of the
10620 20 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65   file too. For e
10630 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45  xample, if.** PE
10640 4e 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79  NDING_BYTE is by
10650 74 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72  te 4096 (the fir
10660 73 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20  st byte of page 
10670 35 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  5) and the size 
10680 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69  of the.** file i
10690 73 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20  s 4096 bytes, 5 
106a0 69 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74  is returned inst
106b0 65 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74  ead of 4..*/.int
106c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
106d0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
106e0 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
106f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
10700 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
10710 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
10720 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
10730 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
10740 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
10750 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
10760 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
10770 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 69 66   } else {.    if
10780 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  ( (rc = sqlite3O
10790 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
107a0 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
107b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
107c0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
107d0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 72 65  r, rc);.      re
107e0 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
107f0 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
10800 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10810 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
10820 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10830 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
10840 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
10850 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10860 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
10870 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
10880 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
10890 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
108a0 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
108b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
108c0 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
108d0 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
108e0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
108f0 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
10900 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48  *.** Clear a PgH
10910 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a  istory block.*/.
10920 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
10930 72 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f  rHistory(PgHisto
10940 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71  ry *pHist){.  sq
10950 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
10960 70 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65  pOrig);.  sqlite
10970 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
10980 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72  t);.  pHist->pOr
10990 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d  ig = 0;.  pHist-
109a0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65  >pStmt = 0;.}.#e
109b0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61  lse.#define clea
109c0 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64  rHistory(x).#end
109d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  if../*.** Forwar
109e0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
109f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
10a00 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
10a10 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70  ../*.** Unlink p
10a20 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
10a30 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
10a40 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
10a50 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
10a60 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
10a70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
10a80 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
10a90 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
10aa0 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
10ab0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
10ac0 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
10ad0 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
10ae0 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
10af0 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
10b00 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
10b10 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
10b20 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
10b30 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
10b40 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
10b50 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
10b60 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
10b70 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
10b80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
10b90 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
10ba0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
10bb0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
10bc0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
10bd0 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
10be0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
10bf0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
10c00 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
10c10 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
10c20 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
10c30 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
10c40 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
10c50 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
10c60 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
10c70 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
10c80 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
10c90 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
10ca0 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
10cb0 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
10cc0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
10cd0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
10ce0 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
10cf0 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
10d00 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
10d10 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
10d20 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
10d30 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
10d40 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
10d50 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
10d60 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
10d70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
10d80 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
10d90 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
10da0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
10db0 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
10dc0 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
10dd0 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
10de0 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
10df0 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
10e00 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
10e10 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
10e20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
10e30 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
10e40 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
10e50 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
10e60 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
10e70 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
10e80 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
10e90 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
10ea0 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
10eb0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10ec0 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
10ed0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
10ee0 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
10ef0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
10f00 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
10f10 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
10f20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
10f30 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
10f40 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
10f50 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
10f60 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
10f70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
10f80 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
10f90 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
10fa0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
10fb0 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
10fc0 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10fd0 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
10fe0 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
10ff0 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
11000 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
11010 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
11020 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
11030 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
11040 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
11050 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
11060 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
11070 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
11080 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
11090 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
110a0 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
110b0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
110c0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
110d0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
110e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
110f0 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
11100 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11110 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
11120 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
11130 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
11140 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
11150 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
11160 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
11170 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
11180 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
11190 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
111a0 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
111b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
111c0 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
111d0 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
111e0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
111f0 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11200 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
11210 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
11220 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
11230 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
11240 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
11250 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
11260 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
11270 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
11280 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
11290 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
112a0 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
112b0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
112c0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
112d0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
112e0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
112f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
11300 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
11310 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
11320 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
11330 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
11340 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
11350 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
11360 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
11370 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
11380 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
11390 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
113a0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  }.}.#else.#defin
113b0 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  e memoryTruncate
113c0 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (p).#endif../*.*
113d0 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
113e0 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65  a lock on a file
113f0 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75  .  Invoke the bu
11400 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74  sy callback if t
11410 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75  he lock.** is cu
11420 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69  rrently not avai
11430 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20 75  lable.  Repeat u
11440 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61  ntil the busy ca
11450 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a  llback returns.*
11460 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c  * false or until
11470 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65   the lock succee
11480 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ds..**.** Return
11490 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75   SQLITE_OK on su
114a0 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72  ccess and an err
114b0 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61  or code if we ca
114c0 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74  nnot obtain.** t
114d0 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
114e0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69  ic int pager_wai
114f0 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20  t_on_lock(Pager 
11500 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63  *pPager, int loc
11510 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63  ktype){.  int rc
11520 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c  ;..  /* The OS l
11530 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74 20  ock values must 
11540 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 74  be the same as t
11550 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76 61  he Pager lock va
11560 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  lues */.  assert
11570 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
11580 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
11590 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
115a0 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
115b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
115c0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
115d0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
115e0 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  OCK );..  /* If 
115f0 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72 72  the file is curr
11600 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74  ently unlocked t
11610 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75 73  hen the size mus
11620 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f 0a  t be unknown */.
11630 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11640 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11650 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  HARED || pPager-
11660 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45 4d  >dbSize<0 || MEM
11670 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61  DB );..  if( pPa
11680 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
11690 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
116a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
116b0 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
116c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
116d0 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
116e0 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20  d, locktype);.  
116f0 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51    }while( rc==SQ
11700 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c  LITE_BUSY && sql
11710 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61  ite3InvokeBusyHa
11720 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42  ndler(pPager->pB
11730 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20  usyHandler) );. 
11740 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
11760 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
11770 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49 4f  cktype;.      IO
11780 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70 20  TRACE(("LOCK %p 
11790 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 6c  %d\n", pPager, l
117a0 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d 0a  ocktype)).    }.
117b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
117c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
117d0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
117e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
117f0 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
11800 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
11810 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  rTruncate(Pager 
11820 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
11830 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
11840 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11850 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11860 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20 29  HARED || MEMDB )
11870 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
11880 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
11890 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
118a0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
118b0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
118c0 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Code;.    return
118d0 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
118e0 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
118f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
11900 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11910 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
11920 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
11930 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
11940 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
11950 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
11960 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
11970 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
11980 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
11990 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
119a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
119b0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
119c0 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
119d0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
119e0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
119f0 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
11a00 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
11a10 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
11a20 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
11a30 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
11a40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11a50 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11a60 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
11a70 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
11a80 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   nPage);.  if( r
11a90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11aa0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
11ab0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ze = nPage;.  }.
11ac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11ad0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
11ae0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
11af0 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
11b00 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
11b10 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
11b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11b30 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
11b40 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
11b50 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
11b60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
11b70 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
11b80 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
11b90 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
11ba0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
11bb0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
11bc0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
11bd0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
11be0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
11bf0 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
11c00 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
11c10 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
11c20 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
11c30 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
11c40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
11c50 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
11c60 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
11c70 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
11c80 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
11c90 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
11ca0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
11cb0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
11cc0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
11cd0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
11ce0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
11cf0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
11d00 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
11d10 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
11d20 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
11d30 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
11d40 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
11d50 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
11d60 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
11d70 41 4e 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 41  ANAGEMENT.  /* A
11d80 20 6d 61 6c 6c 6f 63 28 29 20 63 61 6e 6e 6f 74   malloc() cannot
11d90 20 66 61 69 6c 20 69 6e 20 73 71 6c 69 74 65 33   fail in sqlite3
11da0 54 68 72 65 61 64 44 61 74 61 28 29 20 61 73 20  ThreadData() as 
11db0 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 61 6c 6c  one or more call
11dc0 73 20 74 6f 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  s to .  ** mallo
11dd0 63 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  c() must have al
11de0 72 65 61 64 79 20 62 65 65 6e 20 6d 61 64 65 20  ready been made 
11df0 62 79 20 74 68 69 73 20 74 68 72 65 61 64 20 62  by this thread b
11e00 65 66 6f 72 65 20 69 74 20 67 65 74 73 0a 20 20  efore it gets.  
11e10 2a 2a 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ** to this point
11e20 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 65  . This means the
11e30 20 54 68 72 65 61 64 44 61 74 61 20 6d 75 73 74   ThreadData must
11e40 20 68 61 76 65 20 62 65 65 6e 20 61 6c 6c 6f 63   have been alloc
11e50 61 74 65 64 20 61 6c 72 65 61 64 79 0a 20 20 2a  ated already.  *
11e60 2a 20 73 6f 20 74 68 61 74 20 54 68 72 65 61 64  * so that Thread
11e70 44 61 74 61 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20  Data.nAlloc can 
11e80 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 54  be set..  */.  T
11e90 68 72 65 61 64 44 61 74 61 20 2a 70 54 73 64 20  hreadData *pTsd 
11ea0 3d 20 73 71 6c 69 74 65 33 54 68 72 65 61 64 44  = sqlite3ThreadD
11eb0 61 74 61 28 29 3b 0a 20 20 61 73 73 65 72 74 28  ata();.  assert(
11ec0 20 70 50 61 67 65 72 20 29 3b 0a 20 20 61 73 73   pPager );.  ass
11ed0 65 72 74 28 20 70 54 73 64 20 26 26 20 70 54 73  ert( pTsd && pTs
11ee0 64 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 23 65 6e  d->nAlloc );.#en
11ef0 64 69 66 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73  dif..  disable_s
11f00 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
11f10 72 73 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  rs();.  pPager->
11f20 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
11f30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
11f40 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
11f50 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
11f60 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  .  pagerUnlockAn
11f70 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  dRollback(pPager
11f80 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  );.  enable_simu
11f90 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11fa0 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
11fb0 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50  ("CLOSE %d\n", P
11fc0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
11fd0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f  .  IOTRACE(("CLO
11fe0 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  SE %p\n", pPager
11ff0 29 29 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  )).  assert( pPa
12000 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20  ger->errCode || 
12010 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
12020 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65  Open==0 && pPage
12030 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20  r->stmtOpen==0) 
12040 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
12050 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
12060 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
12070 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
12080 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
12090 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
120a0 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
120b0 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
120c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
120d0 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
120e0 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
120f0 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
12100 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
12110 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
12120 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
12130 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
12140 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
12150 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
12160 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
12170 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
12180 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
12190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
121a0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
121b0 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
121c0 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
121d0 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
121e0 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
121f0 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 54  rting at .  ** T
12200 68 72 65 61 64 44 61 74 61 2e 70 50 61 67 65 72  hreadData.pPager
12210 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67   if memory-manag
12220 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64  ement is enabled
12230 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
12240 67 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65  ger==pTsd->pPage
12250 72 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70  r ){.    pTsd->p
12260 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e  Pager = pPager->
12270 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a  pNext;.  }else{.
12280 20 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b      Pager *pTmp;
12290 0a 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20  .    for(pTmp = 
122a0 70 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54  pTsd->pPager; pT
122b0 6d 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65  mp->pNext!=pPage
122c0 72 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  r; pTmp=pTmp->pN
122d0 65 78 74 29 7b 7d 0a 20 20 20 20 70 54 6d 70 2d  ext){}.    pTmp-
122e0 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d  >pNext = pPager-
122f0 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64  >pNext;.  }.#end
12300 69 66 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  if.  sqliteFree(
12310 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a  pPager->aHash);.
12320 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
12330 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
12340 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
12350 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
12360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
12370 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
12380 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
12390 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
123a0 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
123b0 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62  te3PagerPagenumb
123c0 65 72 28 44 62 50 61 67 65 20 2a 70 29 7b 0a 20  er(DbPage *p){. 
123d0 20 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b   return p->pgno;
123e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
123f0 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
12400 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
12410 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
12420 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
12430 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
12440 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
12450 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
12460 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
12470 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
12480 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
12490 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
124a0 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
124b0 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
124c0 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
124d0 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
124e0 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
124f0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
12500 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
12510 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
12520 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
12530 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
12540 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
12550 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
12560 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
12570 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
12580 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
12590 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
125a0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
125b0 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
125c0 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
125d0 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
125e0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
125f0 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65   pPg==pPg->pPage
12600 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
12610 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
12620 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  p = pPg->pNextFr
12630 65 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ee;.      while(
12640 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e   p && p->needSyn
12650 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78  c ){ p = p->pNex
12660 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70  tFree; }.      p
12670 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
12680 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20  stSynced = p;.  
12690 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
126a0 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20  >pPrevFree ){.  
126b0 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
126c0 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
126d0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
126e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
126f0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46   pPg->pPager->pF
12700 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
12710 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  tFree;.    }.   
12720 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46   if( pPg->pNextF
12730 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
12740 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72  ->pNextFree->pPr
12750 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  evFree = pPg->pP
12760 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c  revFree;.    }el
12770 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  se{.      pPg->p
12780 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70  Pager->pLast = p
12790 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
127a0 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50     }.    pPg->pP
127b0 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
127c0 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
127d0 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b  .  REFINFO(pPg);
127e0 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
127f0 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
12800 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
12810 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
12820 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
12830 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
12840 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
12850 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
12860 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46  Ref++;.      REF
12870 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d  INFO(pPg);.    }
12880 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  .  }.#else.# def
12890 69 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20  ine page_ref(P) 
128a0 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f    ((P)->nRef==0?
128b0 5f 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f  _page_ref(P):(vo
128c0 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a  id)(P)->nRef++).
128d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e  #endif../*.** In
128e0 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
128f0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
12900 61 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70  a page.  The inp
12910 75 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a  ut pointer is.**
12920 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
12930 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  the page data..*
12940 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12950 65 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50  erRef(DbPage *pP
12960 67 29 7b 0a 20 20 70 61 67 65 5f 72 65 66 28 70  g){.  page_ref(p
12970 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  Pg);.  return SQ
12980 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12990 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
129a0 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
129b0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
129c0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
129d0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
129e0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
129f0 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
12a00 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
12a10 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
12a20 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
12a30 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
12a40 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
12a50 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
12a60 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
12a70 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
12a80 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
12a90 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
12aa0 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
12ab0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
12ac0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
12ad0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
12ae0 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
12af0 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
12b00 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
12b10 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
12b20 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
12b30 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
12b40 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
12b50 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
12b60 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
12b70 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
12b80 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
12b90 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
12ba0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12bb0 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
12bc0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
12bd0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
12be0 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
12bf0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
12c00 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
12c10 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
12c20 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
12c30 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
12c40 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
12c50 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
12c60 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
12c70 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
12c80 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
12c90 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
12ca0 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
12cb0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
12cc0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
12cd0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
12ce0 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
12cf0 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
12d00 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
12d10 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72  e, so sync occur
12d20 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12d30 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65  utine clears the
12d40 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20   needSync field 
12d50 6f 66 20 65 76 65 72 79 20 70 61 67 65 20 63 75  of every page cu
12d60 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a  rrent held in.**
12d70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
12d80 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
12d90 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
12da0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
12db0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12dc0 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e  TE_OK;..  /* Syn
12dd0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65  c the journal be
12de0 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74  fore modifying t
12df0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
12e00 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20  .  ** (assuming 
12e10 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e  there is a journ
12e20 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20  al and it needs 
12e30 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20  to be synced.). 
12e40 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12e50 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
12e60 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74    if( !pPager->t
12e70 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  empFile ){.     
12e80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
12e90 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
12ea0 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28        /* assert(
12eb0 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
12ec0 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69   ); // noSync mi
12ed0 67 68 74 20 62 65 20 73 65 74 20 69 66 20 73 79  ght be set if sy
12ee0 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20  nchronous.      
12ef0 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66  ** was turned of
12f00 66 20 61 66 74 65 72 20 74 68 65 20 74 72 61 6e  f after the tran
12f10 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
12f20 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31  ted.  Ticket #61
12f30 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  5 */.#ifndef NDE
12f40 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  BUG.      {.    
12f50 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65      /* Make sure
12f60 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65   the pPager->nRe
12f70 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65  c counter we are
12f80 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a   keeping agrees.
12f90 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20          ** with 
12fa0 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65  the nRec compute
12fb0 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20  d from the size 
12fc0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
12fd0 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
12fe0 20 20 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b          i64 jSz;
12ff0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
13000 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
13010 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53  pPager->jfd, &jS
13020 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  z);.        if( 
13030 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
13040 63 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  c;.        asser
13050 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13060 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20  alOff==jSz );.  
13070 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
13080 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
13090 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
130a0 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
130b0 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
130c0 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
130d0 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
130e0 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
130f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
13100 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
13110 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
13120 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
13130 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
13140 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
13150 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
13160 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
13170 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
13180 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20   rollback. .    
13190 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
131a0 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
131b0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ync ){.         
131c0 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 59   PAGERTRACE2("SY
131d0 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
131e0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
131f0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
13200 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43   IOTRACE(("JSYNC
13210 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
13220 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13230 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
13240 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20  ager->jfd, 0);. 
13250 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
13260 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
13270 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13280 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13290 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64  Seek(pPager->jfd
132a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
132c0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
132d0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
132e0 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
132f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
13300 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 49 4f  n rc;.        IO
13310 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
13320 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
13330 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
13340 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
13350 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
13360 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
13370 2c 20 34 29 29 0a 20 20 20 20 20 20 20 20 72 63  , 4)).        rc
13380 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
13390 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
133a0 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20  er->nRec);.     
133b0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
133c0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20  rn rc;..        
133d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
133e0 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ek(pPager->jfd, 
133f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13400 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ff);.        if(
13410 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
13420 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 50  .      }.      P
13430 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
13440 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
13450 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
13460 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
13470 43 45 28 28 22 4a 53 59 4e 43 20 25 64 5c 6e 22  CE(("JSYNC %d\n"
13480 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20  , pPager)).     
13490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
134a0 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
134b0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73   pPager->full_fs
134c0 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ync);.      if( 
134d0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
134e0 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  c;.      pPager-
134f0 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
13500 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 1;.    }.    p
13510 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
13520 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61  = 0;..    /* Era
13530 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  se the needSync 
13540 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20  flag from every 
13550 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
13560 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
13570 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
13580 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
13590 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
135a0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
135b0 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
135c0 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72  tSynced = pPager
135d0 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23  ->pFirst;.  }..#
135e0 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
135f0 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  /* If the Pager.
13600 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
13610 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65 20   clear then the 
13620 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20  PgHdr.needSync. 
13630 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61 6c   ** flag must al
13640 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72 20  so be clear for 
13650 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72 69  all pages.  Veri
13660 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  fy that this.  *
13670 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20 74  * invariant is t
13680 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65  rue..  */.  else
13690 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  {.    for(pPg=pP
136a0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
136b0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
136c0 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ll){.      asser
136d0 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
136e0 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ==0 );.    }.   
136f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
13700 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 70  >pFirstSynced==p
13710 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29 3b  Pager->pFirst );
13720 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
13730 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13740 2a 2a 20 4d 65 72 67 65 20 74 77 6f 20 6c 69 73  ** Merge two lis
13750 74 73 20 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e  ts of pages conn
13760 65 63 74 65 64 20 62 79 20 70 44 69 72 74 79 20  ected by pDirty 
13770 61 6e 64 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65  and in pgno orde
13780 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74  r..** Do not bot
13790 68 20 66 69 78 69 6e 67 20 74 68 65 20 70 50 72  h fixing the pPr
137a0 65 76 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73  evDirty pointers
137b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
137c0 72 20 2a 6d 65 72 67 65 5f 70 61 67 65 6c 69 73  r *merge_pagelis
137d0 74 28 50 67 48 64 72 20 2a 70 41 2c 20 50 67 48  t(PgHdr *pA, PgH
137e0 64 72 20 2a 70 42 29 7b 0a 20 20 50 67 48 64 72  dr *pB){.  PgHdr
137f0 20 72 65 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b   result, *pTail;
13800 0a 20 20 70 54 61 69 6c 20 3d 20 26 72 65 73 75  .  pTail = &resu
13810 6c 74 3b 0a 20 20 77 68 69 6c 65 28 20 70 41 20  lt;.  while( pA 
13820 26 26 20 70 42 20 29 7b 0a 20 20 20 20 69 66 28  && pB ){.    if(
13830 20 70 41 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67   pA->pgno<pB->pg
13840 6e 6f 20 29 7b 0a 20 20 20 20 20 20 70 54 61 69  no ){.      pTai
13850 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
13860 20 20 20 20 20 20 70 54 61 69 6c 20 3d 20 70 41        pTail = pA
13870 3b 0a 20 20 20 20 20 20 70 41 20 3d 20 70 41 2d  ;.      pA = pA-
13880 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c  >pDirty;.    }el
13890 73 65 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d  se{.      pTail-
138a0 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20  >pDirty = pB;.  
138b0 20 20 20 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a      pTail = pB;.
138c0 20 20 20 20 20 20 70 42 20 3d 20 70 42 2d 3e 70        pB = pB->p
138d0 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
138e0 0a 20 20 69 66 28 20 70 41 20 29 7b 0a 20 20 20  .  if( pA ){.   
138f0 20 70 54 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d   pTail->pDirty =
13900 20 70 41 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   pA;.  }else if(
13910 20 70 42 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pB ){.    pTail
13920 2d 3e 70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20  ->pDirty = pB;. 
13930 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54 61 69   }else{.    pTai
13940 6c 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  l->pDirty = 0;. 
13950 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 73 75   }.  return resu
13960 6c 74 2e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  lt.pDirty;.}../*
13970 0a 2a 2a 20 53 6f 72 74 20 74 68 65 20 6c 69 73  .** Sort the lis
13980 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 63  t of pages in ac
13990 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79  cending order by
139a0 20 70 67 6e 6f 2e 20 20 50 61 67 65 73 20 61 72   pgno.  Pages ar
139b0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62  e.** connected b
139c0 79 20 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  y pDirty pointer
139d0 73 2e 20 20 54 68 65 20 70 50 72 65 76 44 69 72  s.  The pPrevDir
139e0 74 79 20 70 6f 69 6e 74 65 72 73 20 61 72 65 0a  ty pointers are.
139f0 2a 2a 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  ** corrupted by 
13a00 74 68 69 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64  this sort..*/.#d
13a10 65 66 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43  efine N_SORT_BUC
13a20 4b 45 54 20 32 35 0a 73 74 61 74 69 63 20 50 67  KET 25.static Pg
13a30 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65 6c 69  Hdr *sort_pageli
13a40 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29 7b 0a  st(PgHdr *pIn){.
13a50 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53 4f 52    PgHdr *a[N_SOR
13a60 54 5f 42 55 43 4b 45 54 5d 2c 20 2a 70 3b 0a 20  T_BUCKET], *p;. 
13a70 20 69 6e 74 20 69 3b 0a 20 20 6d 65 6d 73 65 74   int i;.  memset
13a80 28 61 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 29  (a, 0, sizeof(a)
13a90 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 20  );.  while( pIn 
13aa0 29 7b 0a 20 20 20 20 70 20 3d 20 70 49 6e 3b 0a  ){.    p = pIn;.
13ab0 20 20 20 20 70 49 6e 20 3d 20 70 2d 3e 70 44 69      pIn = p->pDi
13ac0 72 74 79 3b 0a 20 20 20 20 70 2d 3e 70 44 69 72  rty;.    p->pDir
13ad0 74 79 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  ty = 0;.    for(
13ae0 69 3d 30 3b 20 69 3c 4e 5f 53 4f 52 54 5f 42 55  i=0; i<N_SORT_BU
13af0 43 4b 45 54 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  CKET-1; i++){.  
13b00 20 20 20 20 69 66 28 20 61 5b 69 5d 3d 3d 30 20      if( a[i]==0 
13b10 29 7b 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20  ){.        a[i] 
13b20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = p;.        bre
13b30 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
13b40 0a 20 20 20 20 20 20 20 20 70 20 3d 20 6d 65 72  .        p = mer
13b50 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b 69 5d  ge_pagelist(a[i]
13b60 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 61 5b  , p);.        a[
13b70 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  i] = 0;.      }.
13b80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d      }.    if( i=
13b90 3d 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  =N_SORT_BUCKET-1
13ba0 20 29 7b 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d   ){.      a[i] =
13bb0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
13bc0 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  a[i], p);.    }.
13bd0 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a    }.  p = a[0];.
13be0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53    for(i=1; i<N_S
13bf0 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29  ORT_BUCKET; i++)
13c00 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f  {.    p = merge_
13c10 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d  pagelist(p, a[i]
13c20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
13c30 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
13c40 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
13c50 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
13c60 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
13c70 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
13c80 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
13c90 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
13ca0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13cb0 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
13cc0 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
13cd0 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
13ce0 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
13cf0 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
13d00 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
13d10 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  Pager;.  int rc;
13d20 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ..  if( pList==0
13d30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13d40 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20  _OK;.  pPager = 
13d50 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a  pList->pPager;..
13d60 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
13d70 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20  nt there may be 
13d80 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45  either a RESERVE
13d90 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
13da0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  ock on the.  ** 
13db0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
13dc0 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
13dd0 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  dy an EXCLUSIVE 
13de0 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77  lock, the follow
13df0 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74  ing.  ** calls t
13e00 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  o sqlite3OsLock(
13e10 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20  ) are no-ops..  
13e20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74  **.  ** Moving t
13e30 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53  he lock from RES
13e40 45 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49  ERVED to EXCLUSI
13e50 56 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f  VE actually invo
13e60 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20  lves going.  ** 
13e70 74 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72  through an inter
13e80 6d 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45  mediate state PE
13e90 4e 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49  NDING.   A PENDI
13ea0 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73  NG lock prevents
13eb0 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72   new.  ** reader
13ec0 73 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67  s from attaching
13ed0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13ee0 20 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63   but is unsuffic
13ef0 69 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20  ient for us to. 
13f00 20 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20   ** write.  The 
13f10 69 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e  idea of a PENDIN
13f20 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65  G lock is to pre
13f30 76 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73  vent new readers
13f40 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e   from.  ** comin
13f50 67 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61  g in while we wa
13f60 69 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20  it for existing 
13f70 72 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72  readers to clear
13f80 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c  ..  **.  ** Whil
13f90 65 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  e the pager is i
13fa0 6e 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73  n the RESERVED s
13fb0 74 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e  tate, the origin
13fc0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
13fd0 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67  .  ** is unchang
13fe0 65 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f  ed and we can ro
13ff0 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  llback without h
14000 61 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63  aving to playbac
14010 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e  k the.  ** journ
14020 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  al into the orig
14030 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69  inal database fi
14040 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61  le.  Once we tra
14050 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20  nsition to.  ** 
14060 45 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65  EXCLUSIVE, it me
14070 61 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ans the database
14080 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63   file has been c
14090 68 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72  hanged and any r
140a0 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c  ollback.  ** wil
140b0 6c 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  l require a jour
140c0 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20  nal playback..  
140d0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
140e0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
140f0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
14100 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
14110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14120 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
14130 0a 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f  .  pList = sort_
14140 70 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b  pagelist(pList);
14150 0a 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20  .  while( pList 
14160 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
14170 4c 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20  List->dirty );. 
14180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14190 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
141a0 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
141b0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
141c0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
141d0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
141e0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ;.    /* If ther
141f0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
14200 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
14210 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
14220 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
14230 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
14240 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
14250 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54  ns sqlite3PagerT
14260 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61  runcate() was ca
14270 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  lled to.    ** m
14280 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61  ake the file sma
14290 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79  ller (presumably
142a0 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
142b0 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72  code). Do not wr
142c0 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73  ite.    ** any s
142d0 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65  uch pages to the
142e0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
142f0 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e    if( pList->pgn
14300 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  o<=pPager->dbSiz
14310 65 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  e ){.      char 
14320 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28  *pData = CODEC2(
14330 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
14340 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
14350 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
14360 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
14370 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
14380 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
14390 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
143a0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  gno);.      IOTR
143b0 41 43 45 28 28 22 50 47 4f 55 54 20 25 70 20 25  ACE(("PGOUT %p %
143c0 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 4c  d\n", pPager, pL
143d0 69 73 74 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20  ist->pgno)).    
143e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
143f0 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
14400 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , pData, pPager-
14410 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
14420 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
14430 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
14440 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
14450 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
14460 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 4e    PAGERTRACE3("N
14470 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
14480 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
14490 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
144a0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
144b0 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
144c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c  eturn rc;.    pL
144d0 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  ist->dirty = 0;.
144e0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
144f0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c  ECK_PAGES.    pL
14500 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  ist->pageHash = 
14510 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
14520 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  List);.#endif.  
14530 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
14540 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
14550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
14570 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
14580 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
14590 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
145a0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
145b0 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
145c0 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
145d0 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
145e0 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
145f0 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
14600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
14610 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
14620 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
14630 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
14640 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44  eturn pPager->pD
14650 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  irty;.}../*.** R
14660 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
14670 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75  ere is a hot jou
14680 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65  rnal on the give
14690 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f  n pager..** A ho
146a0 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65  t journal is one
146b0 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
146c0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a  e played back..*
146d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72  *.** If the curr
146e0 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ent size of the 
146f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
14700 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c   0 but a journal
14710 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c   file.** exists,
14720 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c   that is probabl
14730 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  y an old journal
14740 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20   left over from 
14750 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62  a prior.** datab
14760 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61 6d  ase with the sam
14770 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65  e name.  Just de
14780 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
14790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
147a0 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61  hasHotJournal(Pa
147b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
147c0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65  if( !pPager->use
147d0 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e  Journal ) return
147e0 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
147f0 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70  e3OsFileExists(p
14800 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
14810 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
14820 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63  f( sqlite3OsChec
14830 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50  kReservedLock(pP
14840 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75  ager->fd) ) retu
14850 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 0;.  if( sqli
14860 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
14870 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  t(pPager)==0 ){.
14880 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
14890 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ete(pPager->zJou
148a0 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  rnal);.    retur
148b0 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
148c0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
148d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
148e0 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  find a page in t
148f0 68 65 20 63 61 63 68 65 20 74 68 61 74 20 63 61  he cache that ca
14900 6e 20 62 65 20 72 65 63 79 63 6c 65 64 2e 20 0a  n be recycled. .
14910 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
14920 6e 65 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ne may return SQ
14930 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
14940 54 45 5f 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54  TE_FULL or SQLIT
14950 45 5f 4f 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65  E_OK. It .** doe
14960 73 20 6e 6f 74 20 73 65 74 20 74 68 65 20 70 50  s not set the pP
14970 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 76 61  ager->errCode va
14980 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  riable..*/.stati
14990 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 63 79  c int pager_recy
149a0 63 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  cle(Pager *pPage
149b0 72 2c 20 69 6e 74 20 73 79 6e 63 4f 6b 2c 20 50  r, int syncOk, P
149c0 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20  gHdr **ppPg){.  
149d0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70  PgHdr *pPg;.  *p
149e0 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46  pPg = 0;..  /* F
149f0 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
14a00 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
14a10 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
14a20 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
14a30 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
14a40 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
14a50 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
14a60 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
14a70 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
14a80 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
14a90 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
14aa0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
14ab0 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
14ac0 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
14ad0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
14ae0 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
14af0 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
14b00 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
14b10 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
14b20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
14b30 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
14b40 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
14b50 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
14b60 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
14b70 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
14b80 46 69 72 73 74 20 26 26 20 73 79 6e 63 4f 6b 20  First && syncOk 
14b90 26 26 20 21 4d 45 4d 44 42 29 7b 0a 20 20 20 20  && !MEMDB){.    
14ba0 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
14bb0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
14bc0 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
14bd0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14be0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
14bf0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
14c00 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
14c10 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
14c20 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
14c30 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
14c40 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
14c50 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
14c60 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
14c70 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
14c80 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
14c90 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
14ca0 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
14cb0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
14cc0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
14cd0 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
14ce0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
14cf0 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
14d00 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
14d10 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
14d20 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
14d30 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
14d40 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
14d50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
14d60 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
14d70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
14d80 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
14d90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14da0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
14db0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
14dc0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
14dd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
14de0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
14df0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14e00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
14e10 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
14e20 46 69 72 73 74 3b 0a 20 20 7d 0a 20 20 69 66 28  First;.  }.  if(
14e30 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pPg==0 ){.    r
14e40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
14e50 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
14e60 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
14e70 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
14e80 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
14e90 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
14ea0 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
14eb0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
14ec0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
14ed0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
14ee0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
14ef0 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
14f00 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  );.    pPg->dirt
14f10 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
14f20 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
14f30 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
14f40 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
14f50 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
14f60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
14f70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14f80 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
14f90 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b  pPg->dirty==0 );
14fa0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
14fb0 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c  ge we are recycl
14fc0 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73  ing is marked as
14fd0 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c   alwaysRollback,
14fe0 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74   then.  ** set t
14ff0 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73  he global always
15000 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74  Rollback flag, t
15010 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68  hus disabling th
15020 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f  e.  ** sqlite_do
15030 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
15040 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
15050 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
15060 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
15070 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72  * It is necessar
15080 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63  y to do this bec
15090 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61  ause the page ma
150a0 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
150b0 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62  ack.  ** might b
150c0 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20  e reloaded at a 
150d0 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61  later time but a
150e0 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20  t that point we 
150f0 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20  won't remember. 
15100 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20   ** that is was 
15110 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
15120 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61  lback.  This mea
15130 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65  ns that all page
15140 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d  s must.  ** be m
15150 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
15160 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
15170 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20  e on out..  */. 
15180 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
15190 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Rollback ){.    
151a0 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53  IOTRACE(("ALWAYS
151b0 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c  _ROLLBACK %p\n",
151c0 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50   pPager)).    pP
151d0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
151e0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20  back = 1;.  }.. 
151f0 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
15200 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
15210 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
15220 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
15230 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28  */.  unlinkPage(
15240 70 50 67 29 3b 0a 20 20 54 45 53 54 5f 49 4e 43  pPg);.  TEST_INC
15250 52 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29  R(pPager->nOvfl)
15260 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
15270 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
15280 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
15290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
152a0 63 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73  called to free s
152b0 75 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d  uperfluous dynam
152c0 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64  ically allocated
152d0 20 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20   memory.** held 
152e0 62 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73  by the pager sys
152f0 74 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75  tem. Memory in u
15300 73 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65  se by any SQLite
15310 20 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64   pager allocated
15320 0a 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65  .** by the curre
15330 6e 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65  nt thread may be
15340 20 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e   sqliteFree()ed.
15350 0a 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74  .**.** nReq is t
15360 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
15370 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71  es of memory req
15380 75 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73  uired. Once this
15390 20 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65   much has.** bee
153a0 6e 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20  n released, the 
153b0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
153c0 2e 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c  . A negative val
153d0 75 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e  ue for nReq mean
153e0 73 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63  s.** free as muc
153f0 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
15400 69 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e  ible. The return
15410 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f   value is the to
15420 74 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f  tal number .** o
15430 66 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  f bytes of memor
15440 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23  y released..*/.#
15450 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15460 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
15470 45 4d 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65  EMENT.int sqlite
15480 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d  3PagerReleaseMem
15490 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20  ory(int nReq){. 
154a0 20 63 6f 6e 73 74 20 54 68 72 65 61 64 44 61 74   const ThreadDat
154b0 61 20 2a 70 54 73 64 72 6f 20 3d 20 73 71 6c 69  a *pTsdro = sqli
154c0 74 65 33 54 68 72 65 61 64 44 61 74 61 52 65 61  te3ThreadDataRea
154d0 64 4f 6e 6c 79 28 29 3b 0a 20 20 50 61 67 65 72  dOnly();.  Pager
154e0 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 52 65 6c 65   *p;.  int nRele
154f0 61 73 65 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ased = 0;.  int 
15500 69 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  i;..  /* If the 
15510 74 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78  the global mutex
15520 20 69 73 20 68 65 6c 64 2c 20 74 68 69 73 20 73   is held, this s
15530 75 62 72 6f 75 74 69 6e 65 20 62 65 63 6f 6d 65  ubroutine become
15540 73 20 61 0a 20 20 2a 2a 20 6f 2d 6f 70 3b 20 7a  s a.  ** o-op; z
15550 65 72 6f 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  ero bytes of mem
15560 6f 72 79 20 61 72 65 20 66 72 65 65 64 2e 20 20  ory are freed.  
15570 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 0a  This is because.
15580 20 20 2a 2a 20 73 6f 6d 65 20 6f 66 20 74 68 65    ** some of the
15590 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64 20 62 79   code invoked by
155a0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
155b0 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20 74 72 79  ay also.  ** try
155c0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6d   to obtain the m
155d0 75 74 65 78 2c 20 72 65 73 75 6c 74 69 6e 67 20  utex, resulting 
155e0 69 6e 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 20  in a deadlock.. 
155f0 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
15600 33 4f 73 49 6e 4d 75 74 65 78 28 30 29 20 29 7b  3OsInMutex(0) ){
15610 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
15620 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72 6d 6f   }..  /* Outermo
15630 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66 6f 72  st loop runs for
15640 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69 74 65   at most two ite
15650 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 69  rations. First i
15660 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20 2a 2a  teration we.  **
15670 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d 65 6d   try to find mem
15680 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62 65 20  ory that can be 
15690 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f 75 74  released without
156a0 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29   calling fsync()
156b0 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20 69 74  . Second.  ** it
156c0 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68 20 6f  eration (which o
156d0 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68 65 20  nly runs if the 
156e0 66 69 72 73 74 20 66 61 69 6c 65 64 20 74 6f 20  first failed to 
156f0 66 72 65 65 20 6e 52 65 71 20 62 79 74 65 73 20  free nReq bytes 
15700 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 29 20  of.  ** memory) 
15710 69 73 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20  is permitted to 
15720 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20 54 68  call fsync(). Th
15730 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73 65 20  is is of course 
15740 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a 2a 20  much more .  ** 
15750 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a 2f 0a  expensive..  */.
15760 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 31 3b    for(i=0; i<=1;
15770 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4c   i++){..    /* L
15780 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c 6c 20  oop through all 
15790 74 68 65 20 53 51 4c 69 74 65 20 70 61 67 65 72  the SQLite pager
157a0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
157b0 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20  current thread. 
157c0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 3d 70 54 73  */.    for(p=pTs
157d0 64 72 6f 2d 3e 70 50 61 67 65 72 3b 20 70 20 26  dro->pPager; p &
157e0 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65  & (nReq<0 || nRe
157f0 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70 3d  leased<nReq); p=
15800 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  p->pNext){.     
15810 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
15820 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20     int rc;..    
15830 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 70 61    /* For each pa
15840 67 65 72 2c 20 74 72 79 20 74 6f 20 66 72 65 65  ger, try to free
15850 20 61 73 20 6d 61 6e 79 20 70 61 67 65 73 20 61   as many pages a
15860 73 20 70 6f 73 73 69 62 6c 65 20 28 77 69 74 68  s possible (with
15870 6f 75 74 20 0a 20 20 20 20 20 20 2a 2a 20 63 61  out .      ** ca
15880 6c 6c 69 6e 67 20 66 73 79 6e 63 28 29 20 69 66  lling fsync() if
15890 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
158a0 73 74 20 69 74 65 72 61 74 69 6f 6e 20 6f 66 20  st iteration of 
158b0 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20 0a 20  the outermost . 
158c0 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 29 2e 0a 20       ** loop).. 
158d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 77 68       */.      wh
158e0 69 6c 65 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d  ile( SQLITE_OK==
158f0 28 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63 79  (rc = pager_recy
15900 63 6c 65 28 70 2c 20 69 2c 20 26 70 50 67 29 29  cle(p, i, &pPg))
15910 20 26 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20   && pPg) {.     
15920 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e     /* We've foun
15930 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65  d a page to free
15940 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
15950 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
15960 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  n .        ** re
15970 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70  moved from the p
15980 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20  age hash-table, 
15990 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79  free-list and sy
159a0 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20  nced-list .     
159b0 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e     ** (pFirstSyn
159c0 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c  ced). It is stil
159d0 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67  l in the all pag
159e0 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20  es (pAll) list. 
159f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f  .        ** Remo
15a00 76 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20  ve it from this 
15a10 6c 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65  list before free
15a20 69 6e 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ing..        **.
15a30 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a          ** Todo:
15a40 20 43 68 65 63 6b 20 74 68 65 20 50 61 67 65 72   Check the Pager
15a50 2e 70 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d  .pStmt list to m
15a60 61 6b 65 20 73 75 72 65 20 74 68 69 73 20 69 73  ake sure this is
15a70 20 4f 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20   Ok. It .       
15a80 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20   ** probably is 
15a90 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20  though..        
15aa0 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 48 64 72  */.        PgHdr
15ab0 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20   *pTmp;.        
15ac0 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20  assert( pPg );. 
15ad0 20 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f         page_remo
15ae0 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
15af0 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  t(pPg);.        
15b00 69 66 28 20 70 50 67 3d 3d 70 2d 3e 70 41 6c 6c  if( pPg==p->pAll
15b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 70   ){.           p
15b20 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  ->pAll = pPg->pN
15b30 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20  extAll;.        
15b40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
15b50 20 66 6f 72 28 20 70 54 6d 70 3d 70 2d 3e 70 41   for( pTmp=p->pA
15b60 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41  ll; pTmp->pNextA
15b70 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54  ll!=pPg; pTmp=pT
15b80 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d  mp->pNextAll ){}
15b90 0a 20 20 20 20 20 20 20 20 20 20 70 54 6d 70 2d  .          pTmp-
15ba0 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d  >pNextAll = pPg-
15bb0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
15bc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 52 65     }.        nRe
15bd0 6c 65 61 73 65 64 20 2b 3d 20 73 71 6c 69 74 65  leased += sqlite
15be0 41 6c 6c 6f 63 53 69 7a 65 28 70 50 67 29 3b 0a  AllocSize(pPg);.
15bf0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
15c00 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d  ee(pPg);.      }
15c10 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ..      if( rc!=
15c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15c30 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72       /* An error
15c40 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 20   occured whilst 
15c50 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
15c60 61 74 61 62 61 73 65 20 66 69 6c 65 20 6f 72 20  atabase file or 
15c70 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  .        ** jour
15c80 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65 63  nal in pager_rec
15c90 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72 6f  ycle(). The erro
15ca0 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e 65  r is not returne
15cb0 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20  d to the .      
15cc0 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74    ** caller of t
15cd0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e  his function. In
15ce0 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50  stead, set the P
15cf0 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72  ager.errCode var
15d00 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a  iable..        *
15d10 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c  * The error will
15d20 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
15d30 74 68 65 20 75 73 65 72 20 28 6f 72 20 75 73 65  the user (or use
15d40 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20  rs, in the case 
15d50 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  .        ** of a
15d60 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
15d70 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65  che) of the page
15d80 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
15d90 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20  error occured.. 
15da0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
15db0 20 20 61 73 73 65 72 74 28 20 28 72 63 26 30 78    assert( (rc&0x
15dc0 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  ff)==SQLITE_IOER
15dd0 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  R || rc==SQLITE_
15de0 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  FULL );.        
15df0 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
15e00 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
15e10 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65   );.        page
15e20 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a  r_error(p, rc);.
15e30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
15e40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c  }..  return nRel
15e50 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20  eased;.}.#endif 
15e60 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
15e70 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
15e80 4e 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  NT */../*.** Thi
15e90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
15ea0 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  lled to obtain t
15eb0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72  he shared lock r
15ec0 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a  equired before.*
15ed0 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65  * data may be re
15ee0 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
15ef0 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
15f00 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20  shared lock has 
15f10 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
15f20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66  obtained, this f
15f30 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
15f40 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
15f50 74 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  t pagerSharedLoc
15f60 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
15f70 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15f80 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 70  ITE_OK;..  if( p
15f90 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
15fa0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
15fb0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
15fc0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
15fd0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ager->nRef==0 );
15fe0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
15ff0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
16000 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
16010 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
16020 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
16030 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
16040 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16050 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
16060 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
16070 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
16080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16090 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
160a0 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
160b0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
160c0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20   .      /* If a 
160d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
160e0 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
160f0 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
16100 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  ck on the.      
16110 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
16120 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
16130 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
16140 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
16150 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
16160 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f      if( hasHotJo
16170 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 29 7b  urnal(pPager) ){
16180 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65 74 20  .        /* Get 
16190 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
161a0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
161b0 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20  e file. At this 
161c0 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20  point it is.    
161d0 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74      ** important
161e0 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45 44   that a RESERVED
161f0 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74   lock is not obt
16200 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61 79  ained on the way
16210 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
16220 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
16230 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
16240 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
16250 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
16260 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
16270 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
16280 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
16290 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
162a0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 20  hat the.        
162b0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
162c0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
162d0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
162e0 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
162f0 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  it .        ** b
16300 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ack..        ** 
16310 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61  .        ** Beca
16320 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
16330 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
16340 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
16350 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ted, the.       
16360 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65   ** second proce
16370 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74  ss will get to t
16380 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
16390 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
163a0 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62 74  o.        ** obt
163b0 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43  ain it's own EXC
163c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
163d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
163e0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
163f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
16400 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
16410 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  fd, EXCLUSIVE_LO
16420 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  CK);.        if(
16430 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16440 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
16450 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
16460 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
16470 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
16480 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
16490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
164a0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
164b0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
164c0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
164d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
164e0 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20   reading only.  
164f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  Return SQLITE_BU
16500 53 59 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a  SY if.        **
16510 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
16520 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  o open the journ
16530 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20  al file. .      
16540 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
16550 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
16560 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
16570 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73 65  o be locked itse
16580 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20  lf.  The.       
16590 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
165a0 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
165b0 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
165c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
165d0 64 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ds.        ** a 
165e0 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74  write lock, so t
165f0 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
16600 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20  y chance of two 
16610 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 20  or more.        
16620 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65  ** processes ope
16630 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
16640 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
16650 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
16660 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16670 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79  e3OsOpenReadOnly
16680 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
16690 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  l, &pPager->jfd)
166a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
166b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
166c0 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 75           pager_u
166d0 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
166e0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
166f0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
16700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
16710 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16720 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
16730 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
16740 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
16750 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
16760 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nalOff = 0;.    
16770 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d      pPager->setM
16780 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  aster = 0;.     
16790 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
167a0 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20  alHdr = 0;. .   
167b0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
167c0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
167d0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
167e0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
167f0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  e.        ** loc
16800 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
16810 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
16820 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
16830 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
16840 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29  yback(pPager, 1)
16850 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
16860 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16870 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
16880 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
16890 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
168a0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
168b0 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  t(pPager->state=
168c0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
168d0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 70   .            (p
168e0 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
168f0 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Mode && pPager->
16900 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48 41 52  state>PAGER_SHAR
16910 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ED).        );. 
16920 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
16930 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29  ( pPager->pAll )
16940 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
16950 2a 70 50 61 67 65 31 20 3d 20 70 61 67 65 72 5f  *pPage1 = pager_
16960 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 31  lookup(pPager, 1
16970 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16980 50 61 67 65 31 20 29 7b 0a 20 20 20 20 20 20 20  Page1 ){.       
16990 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61     unlinkHashCha
169a0 69 6e 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  in(pPager, pPage
169b0 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  1);.        }.. 
169c0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
169d0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
169e0 67 65 72 2c 20 31 29 20 29 3b 0a 20 20 20 20 20  ger, 1) );.     
169f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
16a00 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
16a10 65 72 2c 20 31 2c 20 26 70 50 61 67 65 31 2c 20  er, 1, &pPage1, 
16a20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
16a30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16a40 0a 09 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
16a50 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 73 74 6f  e-counter is sto
16a60 72 65 64 20 61 74 20 6f 66 66 73 65 74 20 32 34  red at offset 24
16a70 2e 20 53 65 65 20 61 6c 73 6f 0a 20 20 20 20 20  . See also.     
16a80 20 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e       ** pager_in
16a90 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
16aa0 28 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ()..          */
16ab0 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 69  .          u32 i
16ac0 43 68 61 6e 67 65 43 6f 75 6e 74 20 3d 20 72 65  ChangeCount = re
16ad0 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 61  trieve32bits(pPa
16ae0 67 65 31 2c 20 32 34 29 3b 0a 20 20 20 20 20 20  ge1, 24);.      
16af0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
16b00 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  ++;.          sq
16b10 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
16b20 70 50 61 67 65 31 29 3b 0a 20 20 20 20 20 20 20  pPage1);.       
16b30 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
16b40 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  -;.          if(
16b50 20 69 43 68 61 6e 67 65 43 6f 75 6e 74 21 3d 70   iChangeCount!=p
16b60 50 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f  Pager->iChangeCo
16b70 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unt ){.         
16b80 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
16b90 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
16ba0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50    }.          pP
16bb0 61 67 65 72 2d 3e 69 43 68 61 6e 67 65 43 6f 75  ager->iChangeCou
16bc0 6e 74 20 3d 20 69 43 68 61 6e 67 65 43 6f 75 6e  nt = iChangeCoun
16bd0 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
16be0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
16bf0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
16c00 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
16c10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50  pPager->state<=P
16c20 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
16c30 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
16c40 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
16c50 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  CK ){.      pPag
16c60 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
16c70 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a  R_SHARED;.    }.
16c80 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
16c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
16ca0 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
16cb0 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
16cc0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
16cd0 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
16ce0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
16cf0 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
16d00 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
16d10 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
16d20 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
16d30 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
16d40 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
16d50 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
16d60 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
16d70 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
16d80 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
16d90 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
16da0 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
16db0 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
16dc0 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
16dd0 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
16de0 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
16df0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
16e00 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
16e10 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
16e20 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
16e30 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
16e40 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
16e50 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
16e60 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
16e70 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
16e80 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
16e90 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
16ea0 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
16eb0 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
16ec0 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
16ed0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
16ee0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
16ef0 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
16f00 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
16f10 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
16f20 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
16f30 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
16f40 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70  tine and _lookup
16f50 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
16f60 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
16f70 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
16f80 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
16f90 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
16fa0 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
16fb0 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
16fc0 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
16fd0 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
16fe0 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a  reas _lookup().*
16ff0 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
17000 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
17010 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
17020 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
17030 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
17040 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
17050 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
17060 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
17070 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
17080 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b  ..** Since _look
17090 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
170a0 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
170b0 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
170c0 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
170d0 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2a  ournal files..**
170e0 0a 2a 2a 20 49 66 20 63 6c 72 46 6c 61 67 20 69  .** If clrFlag i
170f0 73 20 66 61 6c 73 65 2c 20 74 68 65 20 70 61 67  s false, the pag
17100 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 61  e contents are a
17110 63 74 75 61 6c 6c 79 20 72 65 61 64 20 66 72 6f  ctually read fro
17120 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66 20 63 6c  m disk..** If cl
17130 66 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 69  fFlag is true, i
17140 74 20 6d 65 61 6e 73 20 74 68 65 20 70 61 67 65  t means the page
17150 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
17160 65 72 61 73 65 64 20 61 6e 64 0a 2a 2a 20 72 65  erased and.** re
17170 77 72 69 74 74 65 6e 20 77 69 74 68 6f 75 74 20  written without 
17180 66 69 72 73 74 20 62 65 69 6e 67 20 72 65 61 64  first being read
17190 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   so there is no 
171a0 70 6f 69 6e 74 20 69 74 20 64 6f 69 6e 67 0a 2a  point it doing.*
171b0 2a 20 74 68 65 20 64 69 73 6b 20 49 2f 4f 2e 0a  * the disk I/O..
171c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
171d0 67 65 72 41 63 71 75 69 72 65 28 50 61 67 65 72  gerAcquire(Pager
171e0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
171f0 67 6e 6f 2c 20 44 62 50 61 67 65 20 2a 2a 70 70  gno, DbPage **pp
17200 50 61 67 65 2c 20 69 6e 74 20 63 6c 72 46 6c 61  Page, int clrFla
17210 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  g){.  PgHdr *pPg
17220 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
17230 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17240 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
17250 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
17260 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
17270 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
17280 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
17290 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
172a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
172b0 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
172c0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
172d0 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
172e0 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
172f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
17300 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
17310 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
17320 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
17330 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
17340 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17350 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
17360 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
17370 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
17380 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
17390 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
173a0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
173b0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
173c0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
173d0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
173e0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
173f0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
17400 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
17410 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
17420 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
17430 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
17440 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
17450 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
17460 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
17470 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
17480 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
17490 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
174a0 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
174b0 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
174c0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
174d0 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
174e0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
174f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17500 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
17510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
17520 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
17530 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  K );..  pPg = pa
17540 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
17550 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
17560 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
17570 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
17580 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
17590 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
175a0 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20  .    int h;.    
175b0 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
175c0 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69 66  ->nMiss);.    if
175d0 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
175e0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
175f0 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
17600 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 0a  ==0 || MEMDB ||.
17610 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
17620 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
17630 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f   && pPager->doNo
17640 74 53 79 6e 63 29 0a 20 20 20 20 29 7b 0a 20 20  tSync).    ){.  
17650 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
17660 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
17670 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
17680 61 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61  age>=pPager->nHa
17690 73 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61  sh ){.        pa
176a0 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f  ger_resize_hash_
176b0 74 61 62 6c 65 28 70 50 61 67 65 72 2c 0a 20 20  table(pPager,.  
176c0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
176d0 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20 32 35 36  >nHash<256 ? 256
176e0 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68   : pPager->nHash
176f0 2a 32 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  *2);.        if(
17700 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d 3d   pPager->nHash==
17710 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
17720 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
17730 45 4d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  EM;.        }.  
17740 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 20      }.      pPg 
17750 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
17760 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  w( sizeof(*pPg) 
17770 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  + pPager->pageSi
17780 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177a0 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b   + sizeof(u32) +
177b0 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a   pPager->nExtra.
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
177e0 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48  MEMDB*sizeof(PgH
177f0 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20  istory) );.     
17800 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
17810 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
17820 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
17830 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
17840 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
17850 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66  *pPg));.      if
17860 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
17870 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
17880 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
17890 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ger), 0, sizeof(
178a0 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20  PgHistory));.   
178b0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
178c0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
178d0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
178e0 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
178f0 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65  All;.      pPage
17900 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
17910 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
17920 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ge++;.      if( 
17930 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50  pPager->nPage>pP
17940 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29  ager->nMaxPage )
17950 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
17960 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61  ( pPager->nMaxPa
17970 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61  ge==(pPager->nPa
17980 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20  ge-1) );.       
17990 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
179a0 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  e++;.      }.   
179b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
179c0 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
179d0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67  (pPager, 1, &pPg
179e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
179f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17a00 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17a10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
17a20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17a30 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
17a40 4b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  K );.      asser
17a50 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
17a60 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
17a70 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
17a80 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
17a90 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
17aa0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
17ab0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
17ac0 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
17ad0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
17ae0 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
17af0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
17b00 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
17b10 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
17b20 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
17b30 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
17b40 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
17b50 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
17b60 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
17b70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17b80 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
17b90 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
17ba0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
17bb0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
17bc0 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
17bd0 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
17be0 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
17bf0 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
17c00 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
17c10 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
17c20 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
17c30 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
17c40 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
17c50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
17c60 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
17c70 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
17c80 20 20 7d 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61    }.    makeClea
17c90 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67 2d  n(pPg);.    pPg-
17ca0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
17cb0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20  EFINFO(pPg);..  
17cc0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
17cd0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
17ce0 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20  ->nExtra>0 ){.  
17cf0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
17d00 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
17d10 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65  Pager), 0, pPage
17d20 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20  r->nExtra);.    
17d30 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
17d40 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
17d50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
17d60 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
17d70 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
17d80 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74  rCode;.      ret
17d90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
17da0 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
17db0 68 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74  he page with dat
17dc0 61 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61  a, either by rea
17dd0 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61  ding from the da
17de0 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
17df0 6c 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e  le, or by settin
17e00 67 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67  g the entire pag
17e10 65 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e to zero..    *
17e20 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
17e30 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
17e40 70 50 61 67 65 72 29 3c 28 69 6e 74 29 70 67 6e  pPager)<(int)pgn
17e50 6f 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 20 20  o || MEMDB.     
17e60 20 20 20 20 7c 7c 20 28 63 6c 72 46 6c 61 67 20      || (clrFlag 
17e70 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61  && !pPager->alwa
17e80 79 73 52 6f 6c 6c 62 61 63 6b 29 20 0a 20 20 20  ysRollback) .   
17e90 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
17ea0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
17eb0 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
17ec0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
17ed0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
17ee0 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a  rt( MEMDB==0 );.
17ef0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
17f00 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
17f10 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69  >fd, (pgno-1)*(i
17f20 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
17f30 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
17f40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17f50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
17f60 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
17f70 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
17f80 5f 44 41 54 41 28 70 50 67 29 2c 0a 20 20 20 20  _DATA(pPg),.    
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
17fb0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17fc0 20 20 20 7d 0a 20 20 20 20 20 20 49 4f 54 52 41     }.      IOTRA
17fd0 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
17fe0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
17ff0 29 29 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  )).      PAGERTR
18000 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70  ACE3("FETCH %d p
18010 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
18020 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
18030 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f  >pgno);.      CO
18040 44 45 43 31 28 70 50 61 67 65 72 2c 20 50 47 48  DEC1(pPager, PGH
18050 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
18060 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
18070 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
18080 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
18090 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
180a0 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
180b0 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
180c0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
180d0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
180e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
180f0 72 63 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  rc;.      }else{
18100 0a 20 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e  .        TEST_IN
18110 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64  CR(pPager->nRead
18120 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
18130 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68  ..    /* Link th
18140 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
18150 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65 20  page hash table 
18160 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20  */.    h = pgno 
18170 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  & (pPager->nHash
18180 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  -1);.    assert(
18190 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20   pgno!=0 );.    
181a0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
181b0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
181c0 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
181d0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
181e0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
181f0 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
18200 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
18210 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
18220 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
18230 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
18240 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
18250 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
18260 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
18270 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
18280 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
18290 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
182a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
182b0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
182c0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
182d0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61   cache. */.    a
182e0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
182f0 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29  ef>0 || pgno==1)
18300 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28  ;.    TEST_INCR(
18310 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
18320 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29     page_ref(pPg)
18330 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20  ;.  }.  *ppPage 
18340 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20  = pPg;.  return 
18350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18360 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
18370 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
18380 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
18390 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
183a0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
183b0 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
183c0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
183d0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
183e0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
183f0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
18400 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
18410 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  so sqlite3PagerG
18420 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65  et().  The diffe
18430 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
18440 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e  is routine.** an
18450 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d sqlite3PagerGe
18460 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74  t() is that _get
18470 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68  () will go to th
18480 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a  e disk and read.
18490 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69  ** in the page i
184a0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
184b0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63  t already in cac
184c0 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
184d0 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c  e.** returns NUL
184e0 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  L if the page is
184f0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72   not in cache or
18500 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65   if a disk I/O e
18510 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65  rror .** has eve
18520 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44  r happened..*/.D
18530 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61  bPage *sqlite3Pa
18540 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20  gerLookup(Pager 
18550 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
18560 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
18570 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  g;..  assert( pP
18580 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  ager!=0 );.  ass
18590 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
185a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
185b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
185c0 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
185d0 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  ( !pPager->pAll 
185e0 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  || pPager->exclu
185f0 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20  siveMode );.    
18600 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
18610 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
18620 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
18630 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
18640 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
18650 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  n 0;.  }.  pPg =
18660 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
18670 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
18680 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75  f( pPg==0 ) retu
18690 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66  rn 0;.  page_ref
186a0 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
186b0 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
186c0 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
186d0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
186e0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
186f0 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
18700 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
18710 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
18720 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
18730 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
18740 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
18750 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
18760 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
18770 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
18780 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
18790 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
187a0 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
187b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
187c0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20  bPage *pPg){..  
187d0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
187e0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
187f0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
18800 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
18810 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  g->nRef>0 );.  p
18820 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45  Pg->nRef--;.  RE
18830 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43  FINFO(pPg);..  C
18840 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
18850 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
18860 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
18870 63 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65  ces to a page re
18880 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a  ach 0, call the.
18890 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20    ** destructor 
188a0 61 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65  and add the page
188b0 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
188c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
188d0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
188e0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
188f0 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67      pPager = pPg
18900 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
18910 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30  g->pNextFree = 0
18920 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
18930 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Free = pPager->p
18940 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72  Last;.    pPager
18950 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20  ->pLast = pPg;. 
18960 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
18970 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
18980 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
18990 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a  NextFree = pPg;.
189a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
189b0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
189c0 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
189d0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
189e0 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  nc==0 && pPager-
189f0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  >pFirstSynced==0
18a00 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18a10 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
18a20 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
18a30 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
18a40 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
18a50 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
18a60 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
18a70 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
18a80 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
18a90 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
18aa0 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
18ab0 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
18ac0 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
18ad0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18ae0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
18af0 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
18b00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18b10 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
18b20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
18b30 3d 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ==0 && !pPager->
18b40 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b  exclusiveMode ){
18b50 0a 20 20 20 20 20 20 70 61 67 65 72 55 6e 6c 6f  .      pagerUnlo
18b60 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
18b70 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
18b80 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18b90 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
18ba0 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
18bb0 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
18bc0 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
18bd0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
18be0 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
18bf0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
18c00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
18c10 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
18c20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
18c30 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
18c40 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
18c50 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
18c60 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
18c70 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
18c80 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
18c90 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
18ca0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
18cb0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
18cc0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
18cd0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
18ce0 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73  ( !MEMDB );.  as
18cf0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18d00 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
18d10 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  VED );.  assert(
18d20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18d30 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Open==0 );.  ass
18d40 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
18d50 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
18d60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
18d70 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
18d80 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
18d90 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
18da0 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
18db0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  nal = sqliteMall
18dc0 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  oc( pPager->dbSi
18dd0 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66  ze/8 + 1 );.  if
18de0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
18df0 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  rnal==0 ){.    r
18e00 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18e10 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
18e20 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
18e30 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  l;.  }.  rc = sq
18e40 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
18e50 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  sive(pPager->zJo
18e60 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e  urnal, &pPager->
18e70 6a 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  jfd,.           
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65        pPager->te
18ea0 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65  mpFile);.  pPage
18eb0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
18ec0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
18ed0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
18ee0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
18ef0 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
18f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18f10 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
18f20 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
18f30 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74  }.  sqlite3OsSet
18f40 46 75 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d  FullSync(pPager-
18f50 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
18f60 6c 6c 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c  ll_fsync);.  sql
18f70 69 74 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e  ite3OsSetFullSyn
18f80 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
18f90 61 67 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63  ager->full_fsync
18fa0 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70  );.  sqlite3OsOp
18fb0 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
18fc0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
18fd0 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20  >zDirectory);.  
18fe0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18ff0 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65  pen = 1;.  pPage
19000 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
19010 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
19020 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
19030 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
19040 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70  ollback = 0;.  p
19050 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
19060 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
19070 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  rrCode ){.    rc
19080 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
19090 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  de;.    goto fai
190a0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
190b0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nal;.  }.  pPage
190c0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
190d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
190e0 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75  .  rc = writeJou
190f0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
19100 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
19110 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20  stmtAutoopen && 
19120 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
19130 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
19140 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
19150 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
19160 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19170 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e   && rc!=SQLITE_N
19180 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d  OMEM ){.    rc =
19190 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
191a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
191b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
191c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
191d0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
191e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
191f0 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
19200 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
19210 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
19220 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
19230 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
19240 6e 61 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  nal = 0;.  if( r
19250 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
19260 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ){.    /* If thi
19270 73 20 77 61 73 20 61 20 6d 61 6c 6c 6f 63 28 29  s was a malloc()
19280 20 66 61 69 6c 75 72 65 2c 20 74 68 65 6e 20 77   failure, then w
19290 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6c  e will not be cl
192a0 6f 73 69 6e 67 20 74 68 65 20 70 61 67 65 72 0a  osing the pager.
192b0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 53 6f 20      ** file. So 
192c0 64 65 6c 65 74 65 20 61 6e 79 20 6a 6f 75 72 6e  delete any journ
192d0 61 6c 20 66 69 6c 65 20 77 65 20 6d 61 79 20 68  al file we may h
192e0 61 76 65 20 6a 75 73 74 20 63 72 65 61 74 65 64  ave just created
192f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20  . Otherwise,.   
19300 20 2a 2a 20 74 68 65 20 73 79 73 74 65 6d 20 77   ** the system w
19310 69 6c 6c 20 67 65 74 20 63 6f 6e 66 75 73 65 64  ill get confused
19320 2c 20 77 65 20 68 61 76 65 20 61 20 72 65 61 64  , we have a read
19330 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c  -lock on the fil
19340 65 20 61 6e 64 20 61 0a 20 20 20 20 2a 2a 20 6d  e and a.    ** m
19350 79 73 74 65 72 69 6f 75 73 20 6a 6f 75 72 6e 61  ysterious journa
19360 6c 20 68 61 73 20 61 70 70 65 61 72 65 64 20 69  l has appeared i
19370 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d  n the filesystem
19380 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
19390 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
193a0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
193b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 61 67    }else{.    pag
193c0 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
193d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
193e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
193f0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
19400 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
19410 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
19420 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
19430 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
19440 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
19450 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
19460 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20  e3PagerCommit() 
19470 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
19480 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  *  sqlite3PagerR
19490 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c  ollback() is cal
194a0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
194b0 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 29  ite3PagerClose()
194c0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
194d0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
194e0 55 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  Unref() is calle
194f0 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
19500 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
19510 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
19520 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
19530 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
19540 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
19550 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
19560 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
19570 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
19580 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
19590 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
195a0 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
195b0 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
195c0 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
195d0 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
195e0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
195f0 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
19600 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
19610 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
19620 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
19630 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
19640 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
19650 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
19660 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
19670 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
19680 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
19690 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
196a0 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
196b0 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
196c0 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
196d0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
196e0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
196f0 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
19700 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
19710 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
19720 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
19730 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
19740 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
19750 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
19760 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
19770 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
19780 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
19790 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
197a0 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
197b0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
197c0 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
197d0 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
197e0 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
197f0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
19800 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
19810 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
19820 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
19830 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
19840 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
19850 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
19860 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
19870 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
19880 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
19890 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67 69  sqlite3PagerBegi
198a0 6e 28 44 62 50 61 67 65 20 2a 70 50 67 2c 20 69  n(DbPage *pPg, i
198b0 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 61  nt exFlag){.  Pa
198c0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
198d0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
198e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
198f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
19900 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
19910 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
19920 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
19930 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
19940 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
19950 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
19960 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
19970 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
19980 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
19990 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
199a0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
199b0 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
199c0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
199d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
199e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
199f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
19a00 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
19a10 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
19a20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
19a30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
19a40 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
19a50 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
19a60 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
19a70 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
19a80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
19a90 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
19aa0 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
19ab0 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
19ac0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
19ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19ae0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19af0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
19b00 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
19b10 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ache = 0;.      
19b20 50 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41  PAGERTRACE2("TRA
19b30 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
19b40 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
19b50 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
19b60 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26  er->useJournal &
19b70 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
19b80 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ile ){.        r
19b90 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  c = pager_open_j
19ba0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
19bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19bc0 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72  }else if( pPager
19bd0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
19be0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19bf0 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Off==0 ){.    /*
19c00 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
19c10 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73  en the pager was
19c20 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
19c30 63 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20  cess mode last. 
19c40 20 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65     ** time a (re
19c50 61 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61  ad or write) tra
19c60 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63  nsaction was suc
19c70 63 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75  cessfully conclu
19c80 64 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68  ded.    ** by th
19c90 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49  is connection. I
19ca0 6e 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69  nstead of deleti
19cb0 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ng the journal f
19cc0 69 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20  ile it was .    
19cd0 2a 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64  ** kept open and
19ce0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20   truncated to 0 
19cf0 62 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  bytes..    */.  
19d00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
19d10 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20  ->nRec==0 );.   
19d20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19d30 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29  >origDbSize==0 )
19d40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
19d50 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
19d60 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
19d70 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
19d80 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
19d90 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
19da0 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c  rnal = sqliteMal
19db0 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
19dc0 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 20  ize/8 + 1 );.   
19dd0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49   if( !pPager->aI
19de0 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  nJournal ){.    
19df0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
19e00 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
19e10 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
19e20 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
19e30 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
19e40 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
19e50 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
19e60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19e70 66 66 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49  ff>0 || rc!=SQLI
19e80 54 45 5f 4f 4b 20 29 3b 0a 20 20 72 65 74 75 72  TE_OK );.  retur
19e90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
19ea0 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74 79  ake a page dirty
19eb0 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74 79  .  Set its dirty
19ec0 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69 74   flag and add it
19ed0 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a 2a   to the dirty.**
19ee0 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
19ef0 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 44  tatic void makeD
19f00 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67 29  irty(PgHdr *pPg)
19f10 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
19f20 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67  ty==0 ){.    Pag
19f30 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
19f40 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50  ->pPager;.    pP
19f50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
19f60 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20    pPg->pDirty = 
19f70 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a  pPager->pDirty;.
19f80 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
19f90 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  pDirty ){.      
19fa0 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e  pPager->pDirty->
19fb0 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50 67  pPrevDirty = pPg
19fc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
19fd0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30 3b  >pPrevDirty = 0;
19fe0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
19ff0 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d  rty = pPg;.  }.}
1a000 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 70  ../*.** Make a p
1a010 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65 61  age clean.  Clea
1a020 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74 20  r its dirty bit 
1a030 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66 72  and remove it fr
1a040 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79 20  om the.** dirty 
1a050 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  page list..*/.st
1a060 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43 6c  atic void makeCl
1a070 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ean(PgHdr *pPg){
1a080 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74  .  if( pPg->dirt
1a090 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64 69  y ){.    pPg->di
1a0a0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1a0b0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b 0a   pPg->pDirty ){.
1a0c0 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74        pPg->pDirt
1a0d0 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20  y->pPrevDirty = 
1a0e0 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b  pPg->pPrevDirty;
1a0f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a100 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29  Pg->pPrevDirty )
1a110 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  {.      pPg->pPr
1a120 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
1a130 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
1a140 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a150 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69  pPg->pPager->pDi
1a160 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1a170 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  y;.    }.  }.}..
1a180 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61  ./*.** Mark a da
1a190 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65  ta page as write
1a1a0 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20  able.  The page 
1a1b0 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
1a1c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20  the journal .** 
1a1d0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
1a1e0 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69  re already.  Thi
1a1f0 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
1a200 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
1a210 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65  making.** change
1a220 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  s to a page..**.
1a230 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d  ** The first tim
1a240 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1a250 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
1a260 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65  ger creates a ne
1a270 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  w.** journal and
1a280 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45   acquires a RESE
1a290 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
1a2a0 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74   database.  If t
1a2b0 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c  he RESERVED.** l
1a2c0 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ock could not be
1a2d0 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20   acquired, this 
1a2e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1a2f0 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68  SQLITE_BUSY.  Th
1a300 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75  e.** calling rou
1a310 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20  tine must check 
1a320 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20  for that return 
1a330 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72  value and be car
1a340 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63  eful not to.** c
1a350 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64  hange any page d
1a360 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72  ata until this r
1a370 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
1a380 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
1a390 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
1a3a0 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  ile could not be
1a3b0 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65   written because
1a3c0 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c   the disk is ful
1a3d0 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  l,.** then this 
1a3e0 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1a3f0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20  SQLITE_FULL and 
1a400 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74  does an immediat
1a410 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41  e rollback..** A
1a420 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72  ll subsequent wr
1a430 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73  ite attempts als
1a440 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
1a450 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65  FULL until there
1a460 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f  .** is a call to
1a470 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
1a480 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
1a490 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
1a4a0 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
1a4b0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1a4c0 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70 50  _write(PgHdr *pP
1a4d0 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61 74  g){.  void *pDat
1a4e0 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
1a4f0 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72 20  A(pPg);.  Pager 
1a500 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
1a510 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  Pager;.  int rc 
1a520 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
1a530 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72  /* Check for err
1a540 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ors.  */.  if( p
1a550 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1a560 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  { .    return pP
1a570 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
1a580 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1a590 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
1a5a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50   return SQLITE_P
1a5b0 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  ERM;.  }..  asse
1a5c0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  rt( !pPager->set
1a5d0 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48 45  Master );..  CHE
1a5e0 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
1a5f0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
1a600 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
1a610 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
1a620 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1a630 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
1a640 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
1a650 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
1a660 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65  way..  */.  make
1a670 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
1a680 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1a690 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74   && (pPg->inStmt
1a6a0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   || pPager->stmt
1a6b0 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20  InUse==0) ){.   
1a6c0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1a6d0 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  che = 1;.  }else
1a6e0 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  {..    /* If we 
1a6f0 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74  get this far, it
1a700 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1a710 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65  page needs to be
1a720 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20  .    ** written 
1a730 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
1a740 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68  on journal or th
1a750 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75  e ckeckpoint jou
1a760 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62  rnal.    ** or b
1a770 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oth..    **.    
1a780 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74  ** First check t
1a790 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74  o see that the t
1a7a0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
1a7b0 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20  al exists and.  
1a7c0 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69    ** create it i
1a7d0 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20  f it does not.. 
1a7e0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1a7f0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1a800 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1a810 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a820 33 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c  3PagerBegin(pPg,
1a830 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
1a840 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1a850 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1a860 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1a870 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1a880 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1a890 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
1a8a0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
1a8b0 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
1a8c0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
1a8d0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
1a8e0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1a8f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a900 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1a910 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
1a920 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1a930 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
1a940 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1a950 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1a960 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
1a970 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
1a980 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1a990 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
1a9a0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
1a9b0 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
1a9c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1a9d0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
1a9e0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
1a9f0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
1aa00 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
1aa10 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
1aa20 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
1aa30 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
1aa40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1aa50 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
1aa60 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a  && (pPager->useJ
1aa70 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29  ournal || MEMDB)
1aa80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
1aa90 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
1aaa0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
1aab0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
1aac0 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  t szPg;.        
1aad0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1aae0 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1aaf0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1ab00 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1ab10 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
1ab20 50 41 47 45 52 54 52 41 43 45 33 28 22 4a 4f 55  PAGERTRACE3("JOU
1ab30 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
1ab40 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1ab50 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
1ab60 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
1ab70 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d  t( pHist->pOrig=
1ab80 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
1ab90 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73  pHist->pOrig = s
1aba0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
1abb0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1abc0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
1abd0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
1abe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1abf0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69  mcpy(pHist->pOri
1ac00 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  g, PGHDR_TO_DATA
1ac10 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
1ac20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1ac30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1ac40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
1ac50 33 32 20 63 6b 73 75 6d 2c 20 73 61 76 65 64 3b  32 cksum, saved;
1ac60 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
1ac70 2a 70 44 61 74 61 32 2c 20 2a 70 45 6e 64 3b 0a  *pData2, *pEnd;.
1ac80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
1ac90 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
1aca0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
1acb0 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
1acc0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
1acd0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
1ace0 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
1acf0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
1ad00 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
1ad10 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
1ad20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
1ad30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1ad40 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
1ad50 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1ad60 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   );.          pD
1ad70 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50  ata2 = CODEC2(pP
1ad80 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
1ad90 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
1ada0 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
1adb0 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
1adc0 2c 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a  , (u8*)pData2);.
1add0 20 20 20 20 20 20 20 20 20 20 70 45 6e 64 20 3d            pEnd =
1ade0 20 70 44 61 74 61 32 20 2b 20 70 50 61 67 65 72   pData2 + pPager
1adf0 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
1ae00 20 20 20 20 20 20 70 44 61 74 61 32 20 2d 3d 20        pData2 -= 
1ae10 34 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  4;.          sav
1ae20 65 64 20 3d 20 2a 28 75 33 32 2a 29 70 45 6e 64  ed = *(u32*)pEnd
1ae30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 33  ;.          put3
1ae40 32 62 69 74 73 28 70 45 6e 64 2c 20 63 6b 73 75  2bits(pEnd, cksu
1ae50 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a  m);.          sz
1ae60 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg = pPager->pag
1ae70 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20  eSize+8;.       
1ae80 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61     put32bits(pDa
1ae90 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ta2, pPg->pgno);
1aea0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1aeb0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1aec0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74  Pager->jfd, pDat
1aed0 61 32 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20  a2, szPg);.     
1aee0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a       IOTRACE(("J
1aef0 4f 55 54 20 25 70 20 25 64 20 25 6c 6c 64 20 25  OUT %p %d %lld %
1af00 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
1af10 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
1af20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
1af30 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
1af40 73 7a 50 67 29 29 0a 20 20 20 20 20 20 20 20 20  szPg)).         
1af50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1af60 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20  Off += szPg;.   
1af70 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1af80 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E4("JOURNAL %d p
1af90 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
1afa0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
1afb0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1afc0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1afd0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1afe0 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a  nc);.          *
1aff0 28 75 33 32 2a 29 70 45 6e 64 20 3d 20 73 61 76  (u32*)pEnd = sav
1b000 65 64 3b 0a 0a 09 20 20 2f 2a 20 41 6e 20 65 72  ed;...  /* An er
1b010 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65 64 20  ror has occured 
1b020 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a  writing to the j
1b030 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65  ournal file. The
1b040 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74   .          ** t
1b050 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20  ransaction will 
1b060 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62  be rolled back b
1b070 79 20 74 68 65 20 6c 61 79 65 72 20 61 62 6f 76  y the layer abov
1b080 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
1b090 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1b0a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b0b0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1b0c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  n rc;.          
1b0d0 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  }..          pPa
1b0e0 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
1b0f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1b100 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1b110 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
1b120 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
1b130 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
1b140 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1b150 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
1b160 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1b170 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1b180 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1b190 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1b1a0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1b1b0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
1b1c0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1b1d0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1b1e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
1b1f0 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
1b200 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
1b210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1b220 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b230 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1b240 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
1b250 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
1b260 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1b270 3b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  ;.        PAGERT
1b280 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64  RACE4("APPEND %d
1b290 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
1b2a0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
1b2b0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1b2c0 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1b2d0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1b2e0 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nc);.      }.   
1b2f0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
1b300 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
1b310 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b320 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
1b330 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
1b340 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  al = 1;.    }.  
1b350 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
1b360 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
1b370 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
1b380 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
1b390 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  it,.    ** then 
1b3a0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
1b3b0 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74  t page to the st
1b3c0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
1b3d0 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20    Note that.    
1b3e0 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ** the statement
1b3f0 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
1b400 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65  differs from the
1b410 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61   standard journa
1b420 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20  l format.    ** 
1b430 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73  in that it omits
1b440 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61   the checksums a
1b450 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20  nd the header.. 
1b460 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
1b470 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1b480 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
1b490 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
1b4a0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
1b4b0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ize ){.      ass
1b4c0 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
1b4d0 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
1b4e0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
1b4f0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
1b500 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1b510 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
1b520 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
1b530 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1b540 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ger);.        as
1b550 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74  sert( pHist->pSt
1b560 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt==0 );.       
1b570 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
1b580 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
1b590 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b5a0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
1b5b0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
1b5c0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1b5d0 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  y(pHist->pStmt, 
1b5e0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1b5f0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
1b600 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
1b610 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
1b620 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
1b630 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1b640 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b650 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
1b660 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1b670 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
1b680 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1b690 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1b6a0 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20 20 20  no, 7)-4;.      
1b6b0 20 20 70 75 74 33 32 62 69 74 73 28 70 44 61 74    put32bits(pDat
1b6c0 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  a2, pPg->pgno);.
1b6d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b6e0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1b6f0 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74 61 32  er->stfd, pData2
1b700 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1b710 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 50  ze+4);.        P
1b720 41 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54  AGERTRACE3("STMT
1b730 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
1b740 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1b750 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1b760 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
1b770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b780 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
1b790 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1b7a0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1b7b0 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20  >stmtNRec++;.   
1b7c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1b7d0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
1b7e0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
1b7f0 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e  r->aInStmt[pPg->
1b800 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
1b810 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
1b820 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f     }.      page_
1b830 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1b840 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
1b850 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1b860 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1b870 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
1b880 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1b890 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1b8a0 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
1b8b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
1b8c0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
1b8d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1b8e0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
1b8f0 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1b900 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
1b910 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
1b920 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b930 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1b940 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
1b950 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b960 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1b970 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1b980 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
1b990 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
1b9a0 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
1b9b0 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
1b9c0 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
1b9d0 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
1b9e0 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
1b9f0 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
1ba00 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
1ba10 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1ba20 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
1ba30 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
1ba40 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
1ba50 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
1ba60 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
1ba70 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
1ba80 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
1ba90 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
1baa0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
1bab0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
1bac0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
1bad0 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
1bae0 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
1baf0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
1bb00 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1bb10 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
1bb20 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1bb30 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1bb40 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1bb50 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
1bb60 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1bb70 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
1bb80 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
1bb90 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1bba0 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
1bbb0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
1bbc0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1bbd0 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
1bbe0 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d  ze);..  if( !MEM
1bbf0 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65  DB && nPagePerSe
1bc00 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67  ctor>1 ){.    Pg
1bc10 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
1bc20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
1bc30 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1bc40 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
1bc50 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
1bc60 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1bc70 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
1bc80 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
1bc90 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
1bca0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
1bcb0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1bcc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1bcd0 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
1bce0 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
1bcf0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
1bd00 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1bd10 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
1bd20 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
1bd30 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
1bd40 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
1bd50 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
1bd60 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
1bd70 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
1bd80 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
1bd90 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
1bda0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1bdb0 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1bdc0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1bdd0 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
1bde0 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
1bdf0 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
1be00 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
1be10 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
1be20 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
1be30 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
1be40 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
1be50 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
1be60 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
1be70 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
1be80 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1be90 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1bea0 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
1beb0 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
1bec0 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
1bed0 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
1bee0 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74  ..    nPageCount
1bef0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1bf00 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1bf10 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
1bf20 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
1bf30 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1bf40 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
1bf50 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
1bf60 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
1bf70 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
1bf80 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1bf90 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
1bfa0 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
1bfb0 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
1bfc0 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
1bfd0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1bfe0 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
1bff0 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
1c000 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
1c010 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
1c020 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
1c030 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
1c040 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
1c050 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
1c060 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
1c070 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ii;.      if( !p
1c080 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1c090 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67  l || pg==pPg->pg
1c0a0 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  no || .         
1c0b0 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67   pg>pPager->orig
1c0c0 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67  DbSize || !(pPag
1c0d0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1c0e0 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29  g/8]&(1<<(pg&7))
1c0f0 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20  ).      ) {.    
1c100 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
1c110 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1c120 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1c130 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
1c140 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c150 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
1c160 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b  er, pg, &pPage);
1c170 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1c180 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c190 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1c1a0 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
1c1b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1c1c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1c1d0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
1c1e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1c1f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1c200 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c210 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31  er->doNotSync==1
1c220 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1c230 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20  doNotSync = 0;. 
1c240 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1c250 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
1c260 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
1c270 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1c280 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c290 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
1c2a0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
1c2b0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
1c2c0 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
1c2d0 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
1c2e0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1c2f0 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
1c300 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
1c310 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
1c320 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
1c330 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1c340 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1c350 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
1c360 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
1c370 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a  urn pPg->dirty;.
1c380 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
1c390 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
1c3a0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  CUUM./*.** Repla
1c3b0 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ce the content o
1c3c0 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
1c3d0 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61  with the informa
1c3e0 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72  tion in the thir
1c3f0 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
1c400 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1c410 65 72 4f 76 65 72 77 72 69 74 65 28 50 61 67 65  erOverwrite(Page
1c420 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1c430 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74  pgno, void *pDat
1c440 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
1c450 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
1c460 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1c470 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  Get(pPager, pgno
1c480 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72  , &pPg);.  if( r
1c490 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c4a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c4b0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
1c4c0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1c4d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c4e0 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61  memcpy(sqlite3Pa
1c4f0 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c  gerGetData(pPg),
1c500 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1c510 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
1c520 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1c530 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  rUnref(pPg);.  }
1c540 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1c550 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
1c560 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1c570 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1c580 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
1c590 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1c5a0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
1c5b0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
1c5c0 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f  e "pgno" back to
1c5d0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
1c5e0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
1c5f0 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
1c600 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
1c610 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
1c620 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
1c630 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
1c640 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
1c650 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
1c660 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
1c670 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
1c680 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
1c690 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
1c6a0 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
1c6b0 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
1c6c0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
1c6d0 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
1c6e0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
1c6f0 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
1c700 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  he.** sqlite3Pag
1c710 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
1c720 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61   below, more tha
1c730 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65  n double the spe
1c740 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49  ed.** of large I
1c750 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73  NSERT operations
1c760 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74   and quadruple t
1c770 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67  he speed of larg
1c780 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a  e DELETEs..**.**
1c790 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
1c7a0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65  ne is called, se
1c7b0 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c  t the alwaysRoll
1c7c0 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75  back flag to tru
1c7d0 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74  e..** Subsequent
1c7e0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
1c7f0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1c800 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
1c810 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
1c820 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
1c830 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
1c840 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
1c850 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
1c860 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
1c870 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
1c880 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
1c890 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
1c8a0 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
1c8b0 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
1c8c0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
1c8d0 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
1c8e0 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
1c8f0 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
1c900 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
1c910 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
1c920 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
1c930 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
1c940 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
1c950 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c960 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
1c970 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e  used,.** the don
1c980 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  t_rollback() rou
1c990 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1c9a0 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
1c9b0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a   page contains.*
1c9c0 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  * critical data,
1c9d0 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
1c9e0 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
1c9f0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
1ca00 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65   spite.** of the
1ca10 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
1ca20 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
1ca30 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
1ca40 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
1ca50 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
1ca60 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
1ca70 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74   if( MEMDB ) ret
1ca80 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  urn;..  pPg = pa
1ca90 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1caa0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
1cab0 72 74 28 20 70 50 67 21 3d 30 20 29 3b 20 20 2f  rt( pPg!=0 );  /
1cac0 2a 20 57 65 20 6e 65 76 65 72 20 63 61 6c 6c 20  * We never call 
1cad0 5f 64 6f 6e 74 5f 77 72 69 74 65 20 75 6e 6c 65  _dont_write unle
1cae0 73 73 20 74 68 65 20 70 61 67 65 20 69 73 20 69  ss the page is i
1caf0 6e 20 6d 65 6d 20 2a 2f 0a 20 20 70 50 67 2d 3e  n mem */.  pPg->
1cb00 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
1cb10 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   1;.  if( pPg->d
1cb20 69 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d  irty && !pPager-
1cb30 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
1cb40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1cb50 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
1cb60 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28  HARED );.    if(
1cb70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1cb80 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
1cb90 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
1cba0 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
1cbb0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1cbc0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
1cbd0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1cbe0 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
1cbf0 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
1cc00 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
1cc10 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
1cc20 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1cc30 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
1cc40 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
1cc50 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
1cc60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1cc70 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
1cc80 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1cc90 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
1cca0 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
1ccb0 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
1ccc0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
1ccd0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
1cce0 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1ccf0 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
1cd00 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
1cd10 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
1cd20 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
1cd30 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1cd40 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
1cd50 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
1cd60 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
1cd70 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
1cd80 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
1cd90 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
1cda0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1cdb0 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
1cdc0 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1cdd0 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20  DONT_WRITE page 
1cde0 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e  %d of %d\n", pgn
1cdf0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
1ce00 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41  r));.      IOTRA
1ce10 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64  CE(("CLEAN %p %d
1ce20 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1ce30 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  o)).      makeCl
1ce40 65 61 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66  ean(pPg);.#ifdef
1ce50 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
1ce60 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
1ce70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
1ce80 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
1ce90 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
1cea0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20  }../*.** A call 
1ceb0 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
1cec0 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20  tells the pager 
1ced0 74 68 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61  that if a rollba
1cee0 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74  ck occurs,.** it
1cef0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
1cf00 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
1cf10 20 64 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76   data on the giv
1cf20 65 6e 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a  en page.  This.*
1cf30 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  * means that the
1cf40 20 70 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20   pager does not 
1cf50 68 61 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74  have to record t
1cf60 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e  he given page in
1cf70 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b   the.** rollback
1cf80 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69   journal..*/.voi
1cf90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
1cfa0 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
1cfb0 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
1cfc0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1cfd0 70 50 61 67 65 72 3b 0a 0a 20 20 61 73 73 65 72  pPager;..  asser
1cfe0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1cff0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1d000 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
1d010 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1d020 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1d030 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
1d040 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  back || pPager->
1d050 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1d060 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  | MEMDB ) return
1d070 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e  ;.  if( !pPg->in
1d080 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
1d090 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
1d0a0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
1d0b0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d0c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1d0d0 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  l!=0 );.    pPag
1d0e0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1d0f0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
1d100 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
1d110 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
1d120 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  nal = 1;.    if(
1d130 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1d140 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  se ){.      pPag
1d150 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
1d160 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1d170 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1d180 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
1d190 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
1d1a0 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45 52 54      }.    PAGERT
1d1b0 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
1d1c0 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
1d1d0 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
1d1e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1d1f0 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  ));.    IOTRACE(
1d200 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c  ("GARBAGE %p %d\
1d210 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1d220 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20 69 66  >pgno)).  }.  if
1d230 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1d240 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53  Use && !pPg->inS
1d250 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d  tmt && (int)pPg-
1d260 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  >pgno<=pPager->s
1d270 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  tmtSize ){.    a
1d280 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1d290 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
1d2a0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
1d2b0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
1d2c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d2d0 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a  ->aInStmt!=0 );.
1d2e0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1d2f0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
1d300 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
1d310 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61  o&7);.    page_a
1d320 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
1d330 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  pPg);.  }.}.../*
1d340 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
1d350 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
1d360 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
1d370 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
1d380 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
1d390 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
1d3a0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
1d3b0 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
1d3c0 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
1d3d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
1d3e0 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
1d3f0 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
1d400 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
1d410 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
1d420 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
1d430 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
1d440 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1d450 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
1d460 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1d470 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ode ){.    retur
1d480 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1d490 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1d4a0 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
1d4b0 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
1d4c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
1d4d0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 50 41 47 45  RROR;.  }.  PAGE
1d4e0 52 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20  RTRACE2("COMMIT 
1d4f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1d500 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1d510 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20  EMDB ){.    pPg 
1d520 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1d530 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1d540 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
1d550 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  pPg ){.      cle
1d560 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
1d570 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1d580 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
1d590 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1d5a0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1d5b0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
1d5c0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1d5d0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
1d5e0 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  c = 0;.      pPg
1d5f0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
1d600 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
1d610 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
1d620 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
1d630 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
1d640 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  rty = 0;.#ifndef
1d650 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28   NDEBUG.    for(
1d660 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
1d670 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
1d680 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
1d690 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1d6a0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1d6b0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1d6c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1d6d0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1d6e0 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
1d6f0 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
1d700 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
1d710 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
1d720 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
1d730 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
1d740 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  mt = 0;.    pPag
1d750 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1d760 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65  R_SHARED;.    re
1d770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d780 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
1d790 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20  ->dirtyCache==0 
1d7a0 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65  ){.    /* Exit e
1d7b0 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f  arly (without do
1d7c0 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e  ing the time-con
1d7d0 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73  suming sqlite3Os
1d7e0 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20  Sync() calls).  
1d7f0 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61    ** if there ha
1d800 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
1d810 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1d820 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1d830 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d840 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
1d850 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
1d860 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1d870 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
1d880 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1d890 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1d8a0 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
1d8b0 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70  lite3PagerSync(p
1d8c0 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Pager, 0, 0);.  
1d8d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d8e0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  K ){.    rc = pa
1d8f0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1d900 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
1d910 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1d920 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
1d930 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
1d940 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
1d950 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
1d960 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
1d970 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
1d980 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
1d990 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
1d9a0 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
1d9b0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
1d9c0 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
1d9d0 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
1d9e0 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
1d9f0 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
1da00 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
1da10 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
1da20 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
1da30 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
1da40 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
1da50 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
1da60 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
1da70 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
1da80 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
1da90 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
1daa0 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
1dab0 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
1dac0 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
1dad0 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
1dae0 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
1daf0 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
1db00 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
1db10 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
1db20 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1db30 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
1db40 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1db50 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
1db60 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
1db70 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f   PAGERTRACE2("RO
1db80 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
1db90 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1dba0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
1dbb0 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
1dbc0 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
1dbd0 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
1dbe0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
1dbf0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
1dc00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1dc10 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1dc20 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
1dc30 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
1dc40 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
1dc50 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
1dc60 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
1dc70 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
1dc80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
1dc90 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
1dca0 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
1dcb0 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
1dcc0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
1dcd0 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
1dce0 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
1dcf0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
1dd00 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
1dd10 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1dd20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
1dd30 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
1dd40 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
1dd50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1dd60 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1dd70 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
1dd80 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
1dd90 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
1dda0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
1ddb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ddc0 50 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47  PAGERTRACE3("PAG
1ddd0 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
1dde0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
1ddf0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1de00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1de10 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
1de20 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
1de30 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
1de40 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
1de50 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d  ;.      p->inStm
1de60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
1de70 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70  pPrevStmt = p->p
1de80 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
1de90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1dea0 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
1deb0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65       pPager->xRe
1dec0 69 6e 69 74 65 72 28 70 2c 20 70 50 61 67 65 72  initer(p, pPager
1ded0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1dee0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1def0 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
1df00 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1df10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
1df20 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
1df30 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1df40 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
1df50 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
1df60 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
1df70 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
1df80 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1df90 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
1dfa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1dfb0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
1dfc0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1dfd0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
1dfe0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
1dff0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
1e000 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
1e010 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e020 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
1e030 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
1e040 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
1e050 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
1e060 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1e070 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
1e080 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67  IVE ){.      pag
1e090 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
1e0a0 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
1e0b0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1e0c0 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
1e0d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1e0e0 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
1e0f0 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
1e100 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1e110 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
1e120 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  , 0);.    rc2 = 
1e130 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1e140 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
1e150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1e160 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
1e170 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
1e180 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
1e190 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1e1a0 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 70 50 61  r, 0);.  }.  pPa
1e1b0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1e1c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72  ;..  /* If an er
1e1d0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
1e1e0 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65  g a ROLLBACK, we
1e1f0 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74   can no longer t
1e200 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a 20  rust the pager. 
1e210 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61   ** cache. So ca
1e220 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29  ll pager_error()
1e230 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20   on the way out 
1e240 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f  to make any erro
1e250 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74 65  r .  ** persiste
1e260 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  nt..  */.  retur
1e270 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1e280 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a  ager, rc);.}../*
1e290 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1e2a0 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1e2b0 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
1e2c0 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
1e2d0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
1e2e0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
1e2f0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
1e300 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1e310 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
1e320 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  y(Pager *pPager)
1e330 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1e340 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a  r->readOnly;.}..
1e350 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1e360 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
1e370 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
1e380 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1e390 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28  e3PagerRefcount(
1e3a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e3b0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1e3c0 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66  >nRef;.}..#ifdef
1e3d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a   SQLITE_TEST./*.
1e3e0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1e3f0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
1e400 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
1e410 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
1e420 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74 73  qlite3PagerStats
1e430 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1e440 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b  .  static int a[
1e450 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50  11];.  a[0] = pP
1e460 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b  ager->nRef;.  a[
1e470 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61  1] = pPager->nPa
1e480 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61  ge;.  a[2] = pPa
1e490 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61  ger->mxPage;.  a
1e4a0 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  [3] = pPager->db
1e4b0 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70  Size;.  a[4] = p
1e4c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20  Pager->state;.  
1e4d0 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65  a[5] = pPager->e
1e4e0 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d  rrCode;.  a[6] =
1e4f0 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20   pPager->nHit;. 
1e500 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[7] = pPager->
1e510 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20  nMiss;.  a[8] = 
1e520 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20  pPager->nOvfl;. 
1e530 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[9] = pPager->
1e540 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d  nRead;.  a[10] =
1e550 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b   pPager->nWrite;
1e560 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23  .  return a;.}.#
1e570 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  endif../*.** Set
1e580 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72   the statement r
1e590 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a  ollback point..*
1e5a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1e5b0 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  e should be call
1e5c0 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e  ed with the tran
1e5d0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
1e5e0 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e  already.** open.
1e5f0 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e    A new statemen
1e600 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65  t journal is cre
1e610 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65  ated that can be
1e620 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   used to rollbac
1e630 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20  k.** changes of 
1e640 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d  a single SQL com
1e650 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61  mand within a la
1e660 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  rger transaction
1e670 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e680 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  PagerStmtBegin(P
1e690 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1e6a0 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
1e6b0 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
1e6c0 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
1e6d0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1e6e0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
1e6f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1e700 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b  er->dbSize>=0 );
1e710 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22  .  PAGERTRACE2("
1e720 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
1e730 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1e740 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1e750 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1e760 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
1e770 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1e780 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1e790 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
1e7a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1e7b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1e7c0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1e7d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1e7e0 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
1e7f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e800 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1e810 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1e820 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
1e830 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
1e840 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
1e850 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
1e860 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1e870 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
1e880 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
1e890 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
1e8a0 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
1e8b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e8c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64  NOMEM;.  }.#ifnd
1e8d0 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d  ef NDEBUG.  rc =
1e8e0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1e8f0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1e900 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
1e910 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
1e920 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1e930 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
1e940 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
1e950 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
1e960 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
1e970 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
1e980 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
1e990 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
1e9a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1e9b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1e9c0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
1e9d0 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
1e9e0 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
1e9f0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
1ea00 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
1ea10 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
1ea20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ea30 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 26  3PagerOpentemp(&
1ea40 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
1ea50 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
1ea60 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
1ea70 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ed;.    pPager->
1ea80 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  stmtOpen = 1;.  
1ea90 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1eaa0 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  ec = 0;.  }.  pP
1eab0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1eac0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  = 1;.  return SQ
1ead0 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f  LITE_OK;. .stmt_
1eae0 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20  begin_failed:.  
1eaf0 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
1eb00 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  tmt ){.    sqlit
1eb10 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
1eb20 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67  nStmt);.    pPag
1eb30 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
1eb40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1eb50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69  ;.}../*.** Commi
1eb60 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  t a statement..*
1eb70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1eb80 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67  erStmtCommit(Pag
1eb90 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1eba0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1ebb0 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
1ebc0 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
1ebd0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
1ebe0 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c  "STMT-COMMIT %d\
1ebf0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
1ec00 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d  er));.    if( !M
1ec10 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71  EMDB ){.      sq
1ec20 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67  lite3OsSeek(pPag
1ec30 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
1ec40 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
1ec50 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
1ec60 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
1ec70 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
1ec80 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1ec90 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
1eca0 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
1ecb0 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d    }.    for(pPg=
1ecc0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
1ecd0 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
1ece0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50        pNext = pP
1ecf0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
1ed00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1ed10 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
1ed20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
1ed30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
1ed40 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
1ed50 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1ed60 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1ed70 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1ed80 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1ed90 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1eda0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  ager);.        s
1edb0 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
1edc0 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
1edd0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
1ede0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1edf0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1ee00 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
1ee10 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ee20 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1ee30 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
1ee40 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
1ee50 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
1ee60 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1ee70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1ee80 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
1ee90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1eea0 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28  gerStmtRollback(
1eeb0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1eec0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
1eed0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1eee0 65 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52  e ){.    PAGERTR
1eef0 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
1ef00 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
1ef10 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1ef20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
1ef30 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
1ef40 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
1ef50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
1ef60 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
1ef70 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50  Stmt){.        P
1ef80 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
1ef90 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
1efa0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
1efb0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
1efc0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
1efd0 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
1efe0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1eff0 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
1f000 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f010 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1f020 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
1f030 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
1f040 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
1f050 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f060 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
1f070 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
1f080 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
1f090 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
1f0a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
1f0b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1f0c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f0d0 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
1f0e0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
1f0f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
1f100 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
1f110 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
1f120 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
1f130 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1f140 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
1f150 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
1f160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1f170 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
1f180 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
1f190 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1f1a0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1f1b0 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
1f1c0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1f1d0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1f1e0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
1f1f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f200 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
1f210 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1f220 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1f230 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72  *sqlite3PagerDir
1f240 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
1f250 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1f260 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
1f270 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1f280 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
1f290 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
1f2a0 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
1f2b0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
1f2c0 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
1f2d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1f2e0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1f2f0 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
1f300 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1f310 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
1f320 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
1f330 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
1f340 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
1f350 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
1f360 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
1f370 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1f380 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
1f390 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1f3a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
1f3b0 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ync;.}../*.** Se
1f3c0 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
1f3d0 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
1f3e0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
1f3f0 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65 72  etCodec(.  Pager
1f400 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
1f410 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64   *(*xCodec)(void
1f420 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74  *,void*,Pgno,int
1f430 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65  ),.  void *pCode
1f440 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72  cArg.){.  pPager
1f450 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65  ->xCodec = xCode
1f460 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f  c;.  pPager->pCo
1f470 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41  decArg = pCodecA
1f480 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rg;.}../*.** Thi
1f490 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f4a0 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
1f4b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f4c0 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
1f4d0 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
1f4e0 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
1f4f0 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
1f500 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
1f510 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
1f520 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
1f530 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  {.  PgHdr *pPgHd
1f540 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1f550 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1f560 63 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  c;..  if( !pPage
1f570 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
1f580 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65  ne ){.    /* Ope
1f590 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
1f5a0 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
1f5b0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
1f5c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
1f5d0 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
1f5e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1f5f0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1f600 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
1f610 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f620 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66  (pPgHdr);.    if
1f630 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f640 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a  ) return rc;.  .
1f650 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
1f660 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1f670 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
1f680 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
1f690 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
1f6a0 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 20 20  (pPgHdr, 24);.  
1f6b0 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
1f6c0 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74  t the value just
1f6d0 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20   read and write 
1f6e0 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20  it back to byte 
1f6f0 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67  24. */.    chang
1f700 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20  e_counter++;.   
1f710 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61   put32bits(((cha
1f720 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
1f730 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63 68  (pPgHdr))+24, ch
1f740 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20  ange_counter);. 
1f750 20 20 20 70 50 61 67 65 72 2d 3e 69 43 68 61 6e     pPager->iChan
1f760 67 65 43 6f 75 6e 74 20 3d 20 63 68 61 6e 67 65  geCount = change
1f770 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 0a 20 20 20  _counter;.  .   
1f780 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1f790 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1f7a0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
1f7b0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
1f7c0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68  ;.    pPager->ch
1f7d0 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
1f7e0 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
1f7f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1f800 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
1f810 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
1f820 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
1f830 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
1f840 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
1f850 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1f860 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
1f870 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
1f880 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
1f890 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
1f8a0 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
1f8b0 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
1f8c0 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
1f8d0 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
1f8e0 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
1f8f0 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
1f900 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
1f910 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
1f920 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
1f930 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c  al is synced, al
1f940 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72  l dirty pages wr
1f950 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20  itten.** to the 
1f960 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
1f970 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
1f980 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20  ile synced. The 
1f990 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a  only thing that.
1f9a0 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f  ** remains to co
1f9b0 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
1f9c0 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74  tion is to delet
1f9d0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
1f9e0 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72  le (or.** master
1f9f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
1fa00 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a   specified)..**.
1fa10 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20  ** Note that if 
1fa20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74  zMaster==NULL, t
1fa30 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65  his does not ove
1fa40 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75  rwrite a previou
1fa50 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65  s value.** passe
1fa60 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50  d to an sqlite3P
1fa70 61 67 65 72 53 79 6e 63 28 29 20 63 61 6c 6c 2e  agerSync() call.
1fa80 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
1fa90 74 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f  ter nTrunc is no
1faa0 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
1fab0 20 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74   pager file is t
1fac0 72 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e  runcated to.** n
1fad0 54 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69  Trunc pages (thi
1fae0 73 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74  s is used by aut
1faf0 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
1fb00 65 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  es)..*/.int sqli
1fb10 74 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67  te3PagerSync(Pag
1fb20 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
1fb30 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
1fb40 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20   Pgno nTrunc){. 
1fb50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1fb60 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  _OK;..  PAGERTRA
1fb70 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59  CE4("DATABASE SY
1fb80 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73  NC: File=%s zMas
1fb90 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64  ter=%s nTrunc=%d
1fba0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
1fbb0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1fbc0 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b  Master, nTrunc);
1fbd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
1fbe0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
1fbf0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
1fc00 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
1fc10 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
1fc20 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
1fc30 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1fc40 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
1fc50 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
1fc60 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1fc70 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
1fc80 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
1fc90 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
1fca0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
1fcb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fcc0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1fcd0 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61 73  .    /* If a mas
1fce0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1fcf0 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61 64   name has alread
1fd00 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
1fd10 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75  o the.    ** jou
1fd20 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
1fd30 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75 69  no sync is requi
1fd40 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65 6e  red. This happen
1fd50 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20 20  s when it is.   
1fd60 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68 65   ** written, the
1fd70 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66 61  n the process fa
1fd80 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20 66  ils to upgrade f
1fd90 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 74  rom a RESERVED t
1fda0 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  o an.    ** EXCL
1fdb0 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 20  USIVE lock. The 
1fdc0 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70 72  next time the pr
1fdd0 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20 63  ocess tries to c
1fde0 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a 2a  ommit the.    **
1fdf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65   transaction the
1fe00 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20 68   m-j name will h
1fe10 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
1fe20 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f   written..    */
1fe30 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1fe40 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a 20  ->setMaster ){. 
1fe50 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1fe60 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1fe70 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
1fe80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1fe90 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1fea0 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53 51  exit;.#ifndef SQ
1feb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1fec0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 6e  CUUM.      if( n
1fed0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1fee0 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 74      /* If this t
1fef0 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 6d  ransaction has m
1ff00 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ade the database
1ff10 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20 61   smaller, then a
1ff20 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20 20  ll pages.       
1ff30 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61 72   ** being discar
1ff40 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e 63  ded by the trunc
1ff50 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77 72  ation must be wr
1ff60 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
1ff70 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1ff80 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
1ff90 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 3b  .        Pgno i;
1ffa0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b  .        int iSk
1ffb0 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47  ip = PAGER_MJ_PG
1ffc0 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  NO(pPager);.    
1ffd0 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
1ffe0 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
1fff0 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
20000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
20010 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f   !(pPager->aInJo
20020 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c  urnal[i/8] & (1<
20030 3c 28 69 26 37 29 29 29 20 26 26 20 69 21 3d 69  <(i&7))) && i!=i
20040 53 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20  Skip ){.        
20050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20060 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
20070 20 69 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 20   i, &pPg);.     
20080 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20090 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
200a0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
200b0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
200c0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
200d0 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
200e0 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
200f0 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
20100 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20110 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
20120 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  c_exit;.        
20130 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20    }.        } . 
20140 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
20150 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
20160 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
20170 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
20180 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20190 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
201a0 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63  c_exit;.      rc
201b0 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
201c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
201d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
201e0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
201f0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  ;.    }..#ifndef
20200 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20210 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
20220 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
20230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
20240 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50 61  agerTruncate(pPa
20250 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
20260 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
20270 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
20280 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
20290 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
202a0 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
202b0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
202c0 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
202d0 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
202e0 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
202f0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
20300 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
20310 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
20320 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20330 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
20340 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
20350 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20360 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
20370 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
20380 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
20390 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
203a0 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
203b0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 44  .    IOTRACE(("D
203c0 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  BSYNC %p\n", pPa
203d0 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67 65  ger))..    pPage
203e0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
203f0 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73 65  _SYNCED;.  }else
20400 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e 54   if( MEMDB && nT
20410 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  runc!=0 ){.    r
20420 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20430 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  Truncate(pPager,
20440 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a 73   nTrunc);.  }..s
20450 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  ync_exit:.  retu
20460 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
20470 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
20480 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d  TOVACUUM./*.** M
20490 6f 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65  ove the page ide
204a0 6e 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61  ntified by pData
204b0 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e   to location pgn
204c0 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a  o in the file. .
204d0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
204e0 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
204f0 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  s to the current
20500 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63   page pgno. If c
20510 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70  urrent page.** p
20520 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
20530 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  dy in the rollba
20540 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
20550 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68  s not written th
20560 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69  ere by.** by thi
20570 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73  s routine. The s
20580 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74  ame applies to t
20590 68 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65  he page pData re
205a0 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79  fers to on entry
205b0 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   to.** this rout
205c0 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
205d0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
205e0 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20  e refered to by 
205f0 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c  pData remain val
20600 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
20610 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
20620 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
20630 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64  ge pData (i.e. d
20640 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
20650 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
20660 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
20670 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
20680 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
20690 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
206a0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
206b0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
206c0 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
206d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
206e0 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
206f0 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
20700 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
20710 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
20720 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
20730 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
20740 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
20750 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
20760 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
20770 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
20780 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
20790 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
207a0 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
207b0 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
207c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
207d0 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e  DbPage *pPg, Pgn
207e0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
207f0 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74   *pPgOld; .  int
20800 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
20810 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
20820 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
20830 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54  f>0 );..  PAGERT
20840 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
20850 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
20860 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
20870 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
20880 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
20890 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
208a0 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20  dSync, pgno);.  
208b0 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
208c0 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
208d0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
208e0 67 6e 6f 29 29 0a 0a 20 20 69 66 28 20 70 50 67  gno))..  if( pPg
208f0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
20900 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
20910 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
20920 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
20930 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
20940 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
20950 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
20960 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
20970 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   );.  }..  /* Un
20980 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
20990 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  's hash-chain */
209a0 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
209b0 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
209c0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
209d0 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
209e0 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
209f0 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
20a00 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
20a10 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
20a20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
20a30 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
20a40 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
20a50 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
20a60 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
20a70 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
20a80 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
20a90 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
20aa0 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
20ab0 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  /.  pPgOld = pag
20ac0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
20ad0 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
20ae0 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73  PgOld ){.    ass
20af0 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  ert( pPgOld->nRe
20b00 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69  f==0 );.    unli
20b10 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
20b20 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20  er, pPgOld);.   
20b30 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c   makeClean(pPgOl
20b40 64 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f  d);.    if( pPgO
20b50 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ld->needSync ){.
20b60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20b70 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gOld->inJournal 
20b80 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
20b90 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
20ba0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
20bb0 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   = 1;.      asse
20bc0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
20bd0 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Sync );.    }.  
20be0 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  }..  /* Change t
20bf0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
20c00 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
20c10 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
20c20 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
20c30 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
20c40 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67 6e  =0 );.  pPg->pgn
20c50 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
20c60 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
20c70 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28 20  nHash-1);.  if( 
20c80 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
20c90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
20ca0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
20cb0 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
20cc0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
20cd0 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
20ce0 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70  h = pPg;.  }.  p
20cf0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
20d00 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
20d10 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
20d20 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50  h[h] = pPg;.  pP
20d30 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30  g->pPrevHash = 0
20d40 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  ;..  makeDirty(p
20d50 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  Pg);.  pPager->d
20d60 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a  irtyCache = 1;..
20d70 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
20d80 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  no ){.    /* If 
20d90 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20  needSyncPgno is 
20da0 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
20db0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
20dc0 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20  needs to be .   
20dd0 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66   ** sync()ed bef
20de0 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
20df0 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62  written to datab
20e00 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65  ase file page ne
20e10 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20  edSyncPgno..    
20e20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f  ** Currently, no
20e30 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74   such page exist
20e40 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61  s in the page-ca
20e50 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20  che and the .   
20e60 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75   ** Pager.aInJou
20e70 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65  rnal bit has bee
20e80 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64  n set. This need
20e90 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64  s to be remedied
20ea0 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20   by loading.    
20eb0 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f  ** the page into
20ec0 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
20ed0 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65   and setting the
20ee0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
20ef0 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
20f00 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
20f10 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
20f20 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
20f30 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
20f40 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
20f50 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
20f60 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
20f70 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
20f80 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67 48   int rc;.    PgH
20f90 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20  dr *pPgHdr;.    
20fa0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20fb0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
20fc0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20fd0 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  rGet(pPager, nee
20fe0 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48  dSyncPgno, &pPgH
20ff0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
21000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
21010 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67  urn rc;.    pPag
21020 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
21030 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e 65  ;.    pPgHdr->ne
21040 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
21050 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgHdr->inJourna
21060 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65 44  l = 1;.    makeD
21070 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20  irty(pPgHdr);.  
21080 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
21090 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d  ref(pPgHdr);.  }
210a0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
210b0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
210c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
210d0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
210e0 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
210f0 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
21100 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
21110 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
21120 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50  pPg){.  return P
21130 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
21140 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
21150 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
21160 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
21170 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
21180 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
21190 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
211a0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
211b0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
211c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
211d0 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
211e0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
211f0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
21200 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
21210 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  ?PGHDR_TO_EXTRA(
21220 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b  pPg, pPager):0);
21230 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
21240 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
21250 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
21260 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
21270 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
21280 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
21290 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
212a0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
212b0 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
212c0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
212d0 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
212e0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
212f0 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
21300 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
21310 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
21320 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
21330 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
21340 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
21350 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
21360 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
21370 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
21380 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
21390 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
213a0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
213b0 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
213c0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
213d0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
213e0 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
213f0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
21400 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20 65 4d 6f  Mode){.  if( eMo
21410 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  de>=0 ){.    pPa
21420 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
21430 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a  de = eMode;.  }.
21440 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50    return (int)pP
21450 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
21460 6f 64 65 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  ode;.}..#if defi
21470 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
21480 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
21490 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
214a0 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
214b0 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
214c0 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68  file lock for th
214d0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
214e0 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
214f0 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f  ue is one of NO_
21500 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
21510 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
21520 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ,.** PENDING_LOC
21530 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  K, or EXCLUSIVE_
21540 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LOCK..*/.int sql
21550 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 73 74 61  ite3PagerLocksta
21560 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
21570 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
21580 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70  te3OsLockState(p
21590 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65  Pager->fd);.}.#e
215a0 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
215b0 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
215c0 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
215d0 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
215e0 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
215f0 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
21600 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
21610 72 52 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  rRefdump(Pager *
21620 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
21630 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
21640 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
21650 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
21660 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
21670 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
21680 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
21690 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
216a0 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25  "PAGE %3d addr=%
216b0 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  p nRef=%d\n", . 
216c0 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
216d0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
216e0 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
216f0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
21700 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21710 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a     OMIT_DISKIO */.