/ Hex Artifact Content
Login

Artifact f06b85eb1e43bb2e6a7a5108ac8346576b4b78fa:


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 32 33  : pager.c,v 1.23
0350: 31 20 32 30 30 36 2f 30 31 2f 30 36 20 31 34 3a  1 2006/01/06 14:
0360: 33 32 3a 32 30 20 64 72 68 20 45 78 70 20 24 0a  32:20 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 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) 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 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45 52  rs. .**.** PAGER
0620: 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f 69  ID() takes a poi
0630: 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
0640: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0650: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0660: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0670: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0680: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
0690: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
06a0: 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74  OsFile.** struct
06b0: 20 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e   as it's argumen
06c0: 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  t..*/.#define PA
06d0: 47 45 52 49 44 28 70 29 20 46 49 4c 45 48 41 4e  GERID(p) FILEHAN
06e0: 44 4c 45 49 44 28 26 28 70 29 2d 3e 66 64 29 0a  DLEID(&(p)->fd).
06f0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
0700: 4c 45 49 44 28 66 64 29 20 28 73 71 6c 69 74 65  LEID(fd) (sqlite
0710: 33 4f 73 46 69 6c 65 48 61 6e 64 6c 65 28 26 66  3OsFileHandle(&f
0720: 64 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  d))../*.** The p
0730: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0740: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0750: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
0760: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
0770: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
0780: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
0790: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07a0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07b0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
07e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
07f0: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0820: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0830: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
0860: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
0870: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0880: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
0890: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08a0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08b0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
08c0: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
08d0: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
08e0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
08f0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0900: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0910: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0920: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0940: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0950: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
0960: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
0970: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
0980: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
0990: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09a0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09c0: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
09d0: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
09e0: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
09f0: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a10: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a20: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a30: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a40: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a50: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0a60: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0a70: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0a80: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0aa0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0ab0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0ac0: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ae0: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0af0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b00: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b10: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b20: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b30: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b50: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0b60: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0b70: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b90: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0ba0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bb0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0bc0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0bd0: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0be0: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0bf0: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c00: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c10: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c20: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c30: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0c60: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0c70: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0c80: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ca0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cb0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0cc0: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0cf0: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d00: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 74 68   is to remove th
0d10: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
0d20: 20 20 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e             journ
0d30: 61 6c 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  al file and the 
0d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
0d50: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
0d70: 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
0d80: 65 20 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d  e page cache com
0d90: 65 73 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55  es up in PAGER_U
0da0: 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73  NLOCK.  The firs
0db0: 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69  t time a.** sqli
0dc0: 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 6f  te3pager_get() o
0dd0: 63 63 75 72 73 2c 20 74 68 65 20 73 74 61 74 65  ccurs, the state
0de0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20   transitions to 
0df0: 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a  PAGER_SHARED..**
0e00: 20 41 66 74 65 72 20 61 6c 6c 20 70 61 67 65 73   After all pages
0e10: 20 68 61 76 65 20 62 65 65 6e 20 72 65 6c 65 61   have been relea
0e20: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
0e30: 5f 70 61 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a  _page_unref(),.*
0e40: 2a 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  * the state tran
0e50: 73 69 74 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20  sitions back to 
0e60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54  PAGER_UNLOCK.  T
0e70: 68 65 20 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a  he first time.**
0e80: 20 74 68 61 74 20 73 71 6c 69 74 65 33 70 61 67   that sqlite3pag
0e90: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
0ea0: 6c 6c 65 64 2c 20 74 68 65 20 73 74 61 74 65 20  lled, the state 
0eb0: 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 0a 2a  transitions to.*
0ec0: 2a 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  * PAGER_RESERVED
0ed0: 2e 20 20 28 4e 6f 74 65 20 74 68 61 74 20 73 71  .  (Note that sq
0ee0: 6c 69 74 65 5f 70 61 67 65 5f 77 72 69 74 65 28  lite_page_write(
0ef0: 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a  ) can only be.**
0f00: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 6f 75   called on an ou
0f10: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20 77  tstanding page w
0f20: 68 69 63 68 20 6d 65 61 6e 73 20 74 68 61 74 20  hich means that 
0f30: 74 68 65 20 70 61 67 65 72 20 6d 75 73 74 0a 2a  the pager must.*
0f40: 2a 20 62 65 20 69 6e 20 50 41 47 45 52 5f 53 48  * be in PAGER_SH
0f50: 41 52 45 44 20 62 65 66 6f 72 65 20 69 74 20 74  ARED before it t
0f60: 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41  ransitions to PA
0f70: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 29 0a 2a  GER_RESERVED.).*
0f80: 2a 20 54 68 65 20 74 72 61 6e 73 69 74 69 6f 6e  * The transition
0f90: 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53   to PAGER_EXCLUS
0fa0: 49 56 45 20 6f 63 63 75 72 73 20 77 68 65 6e 20  IVE occurs when 
0fb0: 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61 6e 67  before any chang
0fc0: 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74  es.** are made t
0fd0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
0fe0: 69 6c 65 2e 20 20 41 66 74 65 72 20 61 6e 20 73  ile.  After an s
0ff0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
1000: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
1010: 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite_pager_commit
1020: 28 29 2c 20 74 68 65 20 73 74 61 74 65 20 67 6f  (), the state go
1030: 65 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  es back to PAGER
1040: 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23 64 65 66  _SHARED..*/.#def
1050: 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  ine PAGER_UNLOCK
1060: 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65 20        0.#define 
1070: 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20 20  PAGER_SHARED    
1080: 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61 73    1   /* same as
1090: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a   SHARED_LOCK */.
10a0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52 45  #define PAGER_RE
10b0: 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f 2a  SERVED    2   /*
10c0: 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56 45   same as RESERVE
10d0: 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e  D_LOCK */.#defin
10e0: 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  e PAGER_EXCLUSIV
10f0: 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65 20  E   4   /* same 
1100: 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  as EXCLUSIVE_LOC
1110: 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  K */.#define PAG
1120: 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20 35  ER_SYNCED      5
1130: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53  ../*.** If the S
1140: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52  QLITE_BUSY_RESER
1150: 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20 69  VED_LOCK macro i
1160: 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61 74  s set to true at
1170: 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a 2a   compile-time,.*
1180: 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61 74  * then failed at
1190: 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61 20  tempts to get a 
11a0: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77 69  reserved lock wi
11b0: 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75  ll invoke the bu
11c0: 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  sy callback..** 
11d0: 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20 64  This is off by d
11e0: 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65 20  efault.  To see 
11f0: 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74 68  why, consider th
1200: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65 6e  e following scen
1210: 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75 70  ario:.** .** Sup
1220: 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61 6c  pose thread A al
1230: 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61 72  ready has a shar
1240: 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e 74  ed lock and want
1250: 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63  s a reserved loc
1260: 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20 61  k..** Thread B a
1270: 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65 73  lready has a res
1280: 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  erved lock and w
1290: 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69 76  ants an exclusiv
12a0: 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20 62  e lock.  If.** b
12b0: 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65 20  oth threads are 
12c0: 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73 79  using their busy
12d0: 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20 6d   callbacks, it m
12e0: 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20 74  ight be a long t
12f0: 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f 6e  ime.** be for on
1300: 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64 73  e of the threads
1310: 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c 6c   give up and all
1320: 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74 6f  ows the other to
1330: 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75 74   proceed..** But
1340: 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20 74   if the thread t
1350: 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68 65  rying to get the
1360: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 67   reserved lock g
1370: 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79 0a  ives up quickly.
1380: 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72 20  ** (if it never 
1390: 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73 79  invokes its busy
13a0: 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e 20   callback) then 
13b0: 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 77  the contention w
13c0: 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c 76  ill be.** resolv
13d0: 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a 23  ed quickly..*/.#
13e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42 55  ifndef SQLITE_BU
13f0: 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
1400: 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
1410: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
1420: 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OCK 0.#endif../*
1430: 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20 72  .** This macro r
1440: 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70 20  ounds values up 
1450: 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 76  so that if the v
1460: 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72 65  alue is an addre
1470: 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61 72  ss it.** is guar
1480: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e 20  anteed to be an 
1490: 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73 20  address that is 
14a0: 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38 2d  aligned to an 8-
14b0: 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a  byte boundary..*
14c0: 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45 5f  /.#define FORCE_
14d0: 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20 28  ALIGNMENT(X)   (
14e0: 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a 0a  ((X)+7)&~7)../*.
14f0: 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  ** Each in-memor
1500: 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67  y image of a pag
1510: 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  e begins with th
1520: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64  e following head
1530: 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64  er..** This head
1540: 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62  er is only visib
1550: 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65 72  le to this pager
1560: 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c   module.  The cl
1570: 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61  ient.** code tha
1580: 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65  t calls pager se
1590: 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61  es only the data
15a0: 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68   that follows th
15b0: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
15c0: 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75  Client code shou
15d0: 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 70  ld call sqlite3p
15e0: 61 67 65 72 5f 77 72 69 74 65 28 29 20 6f 6e 20  ager_write() on 
15f0: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1600: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1610: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1620: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1630: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1640: 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 0a 2a  3pager_write().*
1650: 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  * is called, the
1660: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
1670: 6f 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74  ontents are writ
1680: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c  ten into the rol
1690: 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  lback.** journal
16a0: 20 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75   and PgHdr.inJou
16b0: 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e  rnal and PgHdr.n
16c0: 65 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e  eedSync are set.
16d0: 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a    Later, once.**
16e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67   the journal pag
16f0: 65 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e  e has made it on
1700: 74 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66  to the disk surf
1710: 61 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53  ace, PgHdr.needS
1720: 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  ync.** is cleare
1730: 64 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64  d.  The modified
1740: 20 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20   page cannot be 
1750: 77 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74  written back int
1760: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a  o the original.*
1770: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  * database file 
1780: 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61  until the journa
1790: 6c 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e  l pages has been
17a0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
17b0: 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72  and the.** PgHdr
17c0: 2e 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65  .needSync has be
17d0: 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a  en cleared..**.*
17e0: 2a 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74  * The PgHdr.dirt
17f0: 79 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68  y flag is set wh
1800: 65 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  en sqlite3pager_
1810: 77 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65  write() is calle
1820: 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61  d and.** is clea
1830: 72 65 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74  red again when t
1840: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
1850: 69 73 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  is written back 
1860: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  to the original.
1870: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1880: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
1890: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
18a0: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
18b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
18e0: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
18f0: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
1900: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1920: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
1930: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
1940: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
1950: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
1960: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
1970: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
1980: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
1990: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
19a0: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
19b0: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
19c0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
19d0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
19e0: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
19f0: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
1a00: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
1a10: 50 67 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74  PgHdr *pNextStmt
1a20: 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f  , *pPrevStmt;  /
1a30: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
1a40: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
1a50: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38   journal */.  u8
1a60: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a80: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
1a90: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
1aa0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74  nal */.  u8 inSt
1ab0: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  mt;             
1ac0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
1ad0: 69 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  if in the statem
1ae0: 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  ent subjournal *
1af0: 2f 0a 20 20 75 38 20 64 69 72 74 79 3b 20 20 20  /.  u8 dirty;   
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 77 65     /* TRUE if we
1b20: 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 62   need to write b
1b30: 61 63 6b 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ack changes */. 
1b40: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e 61 6c 20  /* Sync journal 
1b70: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
1b80: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
1b90: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b   alwaysRollback;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
1bc0: 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 69 73  lback() for this
1bd0: 20 70 61 67 65 20 2a 2f 0a 20 20 73 68 6f 72 74   page */.  short
1be0: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
1bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1c00: 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f 66 20  ber of users of 
1c10: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 50  this page */.  P
1c20: 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20  gHdr *pDirty;   
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 44 69 72 74 79 20 70 61 67 65 73 20 73 6f 72   Dirty pages sor
1c50: 74 65 64 20 62 79 20 50 67 48 64 72 2e 70 67 6e  ted by PgHdr.pgn
1c60: 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  o */.#ifdef SQLI
1c70: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
1c80: 20 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23   u32 pageHash;.#
1c90: 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50 61 67 65  endif.  /* pPage
1ca0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
1cb0: 73 20 6f 66 20 70 61 67 65 20 64 61 74 61 20 66  s of page data f
1cc0: 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65 61 64 65  ollow this heade
1cd0: 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72 2e  r */.  /* Pager.
1ce0: 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66 20  nExtra bytes of 
1cf0: 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f 6c 6c 6f  local data follo
1d00: 77 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20  w the page data 
1d10: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  */.};../*.** For
1d20: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6f 6e   an in-memory on
1d30: 6c 79 20 64 61 74 61 62 61 73 65 2c 20 73 6f 6d  ly database, som
1d40: 65 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  e extra informat
1d50: 69 6f 6e 20 69 73 20 72 65 63 6f 72 64 65 64 20  ion is recorded 
1d60: 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68 20 70 61  about.** each pa
1d70: 67 65 20 73 6f 20 74 68 61 74 20 63 68 61 6e 67  ge so that chang
1d80: 65 73 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  es can be rolled
1d90: 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72 6e 61 6c   back.  (Journal
1da0: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 0a 2a   files are not.*
1db0: 2a 20 75 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65  * used for in-me
1dc0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 29  mory databases.)
1dd0: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1de0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 61  information is a
1df0: 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68 65 20 65  dded to.** the e
1e00: 6e 64 20 6f 66 20 65 76 65 72 79 20 45 58 54 52  nd of every EXTR
1e10: 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69 6e 2d 6d  A block for in-m
1e20: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
1e30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 6e 66 6f  .**.** This info
1e40: 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64 20 68 61  rmation could ha
1e50: 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 64 69  ve been added di
1e60: 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 50 67  rectly to the Pg
1e70: 48 64 72 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  Hdr structure..*
1e80: 2a 20 42 75 74 20 74 68 65 6e 20 69 74 20 77 6f  * But then it wo
1e90: 75 6c 64 20 74 61 6b 65 20 75 70 20 61 6e 20 65  uld take up an e
1ea0: 78 74 72 61 20 38 20 62 79 74 65 73 20 6f 66 20  xtra 8 bytes of 
1eb0: 73 74 6f 72 61 67 65 20 6f 6e 20 65 76 65 72 79  storage on every
1ec0: 20 50 67 48 64 72 0a 2a 2a 20 65 76 65 6e 20 66   PgHdr.** even f
1ed0: 6f 72 20 64 69 73 6b 2d 62 61 73 65 64 20 64 61  or disk-based da
1ee0: 74 61 62 61 73 65 73 2e 20 20 53 70 6c 69 74 74  tabases.  Splitt
1ef0: 69 6e 67 20 69 74 20 6f 75 74 20 73 61 76 65 73  ing it out saves
1f00: 20 38 20 62 79 74 65 73 2e 20 20 54 68 69 73 0a   8 bytes.  This.
1f10: 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20 73 61 76  ** is only a sav
1f20: 69 6e 67 73 20 6f 66 20 30 2e 38 25 20 62 75 74  ings of 0.8% but
1f30: 20 74 68 6f 73 65 20 70 65 72 63 65 6e 74 61 67   those percentag
1f40: 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f 0a 74 79  es add up..*/.ty
1f50: 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67 48  pedef struct PgH
1f60: 69 73 74 6f 72 79 20 50 67 48 69 73 74 6f 72 79  istory PgHistory
1f70: 3b 0a 73 74 72 75 63 74 20 50 67 48 69 73 74 6f  ;.struct PgHisto
1f80: 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f 72 69 67  ry {.  u8 *pOrig
1f90: 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67 69 6e 61  ;     /* Origina
1fa0: 6c 20 70 61 67 65 20 74 65 78 74 2e 20 20 52 65  l page text.  Re
1fb0: 73 74 6f 72 65 20 74 6f 20 74 68 69 73 20 6f 6e  store to this on
1fc0: 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62 61 63 6b   a full rollback
1fd0: 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74 6d 74 3b   */.  u8 *pStmt;
1fe0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 61 73 20       /* Text as 
1ff0: 69 74 20 77 61 73 20 61 74 20 74 68 65 20 62 65  it was at the be
2000: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 63  ginning of the c
2010: 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
2020: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20   */.};../*.** A 
2030: 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20 69  macro used for i
2040: 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64 65  nvoking the code
2050: 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e  c if there is on
2060: 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  e.*/.#ifdef SQLI
2070: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20 64  TE_HAS_CODEC.# d
2080: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
2090: 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64  N,X) if( P->xCod
20a0: 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  ec ){ P->xCodec(
20b0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
20c0: 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a 23 20 64  ,X); }.#else.# d
20d0: 65 66 69 6e 65 20 43 4f 44 45 43 28 50 2c 44 2c  efine CODEC(P,D,
20e0: 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  N,X).#endif../*.
20f0: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70 6f 69  ** Convert a poi
2100: 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64 72 20  nter to a PgHdr 
2110: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2120: 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20 61 6e  o its data.** an
2130: 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a 2a 2f  d back again..*/
2140: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2150: 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76 6f 69  O_DATA(P)  ((voi
2160: 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a 23 64  d*)(&(P)[1])).#d
2170: 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f 50 47  efine DATA_TO_PG
2180: 48 44 52 28 44 29 20 20 28 26 28 28 50 67 48 64  HDR(D)  (&((PgHd
2190: 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23 64 65  r*)(D))[-1]).#de
21a0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
21b0: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
21c0: 29 26 28 28 63 68 61 72 2a 29 28 26 28 47 29 5b  )&((char*)(&(G)[
21d0: 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65 53 69  1]))[(P)->pageSi
21e0: 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48  ze]).#define PGH
21f0: 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50 47 52  DR_TO_HIST(P,PGR
2200: 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  )  \.           
2210: 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29 26 28   ((PgHistory*)&(
2220: 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31 5d 29  (char*)(&(P)[1])
2230: 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53 69 7a  )[(PGR)->pageSiz
2240: 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72 61 5d  e+(PGR)->nExtra]
2250: 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f 77 20 62 69 67  )../*.** How big
2260: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 68 61 73   to make the has
2270: 68 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72  h table used for
2280: 20 6c 6f 63 61 74 69 6e 67 20 69 6e 2d 6d 65 6d   locating in-mem
2290: 6f 72 79 20 70 61 67 65 73 0a 2a 2a 20 62 79 20  ory pages.** by 
22a0: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 54 68 69  page number. Thi
22b0: 73 20 6d 61 63 72 6f 20 6c 6f 6f 6b 73 20 61 20  s macro looks a 
22c0: 6c 69 74 74 6c 65 20 73 69 6c 6c 79 2c 20 62 75  little silly, bu
22d0: 74 20 69 73 20 65 76 61 6c 75 61 74 65 64 0a 2a  t is evaluated.*
22e0: 2a 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  * at compile-tim
22f0: 65 2c 20 6e 6f 74 20 72 75 6e 2d 74 69 6d 65 20  e, not run-time 
2300: 28 61 74 20 6c 65 61 73 74 20 66 6f 72 20 67 63  (at least for gc
2310: 63 20 74 68 69 73 20 69 73 20 74 72 75 65 29 2e  c this is true).
2320: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50 47  .*/.#define N_PG
2330: 5f 48 41 53 48 20 28 5c 0a 20 20 28 4d 41 58 5f  _HASH (\.  (MAX_
2340: 50 41 47 45 53 3e 31 30 32 34 29 3f 32 30 34 38  PAGES>1024)?2048
2350: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2360: 3e 35 31 32 29 3f 31 30 32 34 3a 20 5c 0a 20 20  >512)?1024: \.  
2370: 28 4d 41 58 5f 50 41 47 45 53 3e 32 35 36 29 3f  (MAX_PAGES>256)?
2380: 35 31 32 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41  512: \.  (MAX_PA
2390: 47 45 53 3e 31 32 38 29 3f 32 35 36 3a 20 5c 0a  GES>128)?256: \.
23a0: 20 20 28 4d 41 58 5f 50 41 47 45 53 3e 36 34 29    (MAX_PAGES>64)
23b0: 3f 31 32 38 3a 36 34 20 5c 0a 29 0a 0a 2f 2a 0a  ?128:64 \.)../*.
23c0: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
23d0: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
23e0: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
23f0: 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53   ((PN)&(N_PG_HAS
2400: 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  H-1))../*.** A o
2410: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
2420: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
2430: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
2440: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
2450: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 75 38  uct Pager {.  u8
2460: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
2470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2480: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
2490: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
24a0: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
24b0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
24c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
24d0: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
24e0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
24f0: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
2500: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2510: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
2520: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
2530: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
2540: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
2550: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2560: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
2570: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
2580: 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20    u8 stmtOpen;  
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25a0: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
25b0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
25c0: 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75  l is open */.  u
25d0: 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20  8 stmtInUse;    
25e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25f0: 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73  ue we are in a s
2600: 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
2610: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  saction */.  u8 
2620: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20  stmtAutoopen;   
2630: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
2640: 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68   stmt journal wh
2650: 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  en main journal 
2660: 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38  is opened*/.  u8
2670: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
2680: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
2690: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
26a0: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
26b0: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26d0: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
26e0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
26f0: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
2700: 0a 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20  .  u8 state;    
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2720: 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20  * PAGER_UNLOCK, 
2730: 5f 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56  _SHARED, _RESERV
2740: 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38  ED, etc. */.  u8
2750: 20 65 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20   errMask;       
2760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2770: 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64   of several kind
2780: 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20  s of errors */. 
2790: 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20   u8 tempFile;   
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b0: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74  zFilename is a t
27c0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f  emporary file */
27d0: 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20  .  u8 readOnly; 
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27f0: 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65 61  * True for a rea
2800: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
2810: 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63  */.  u8 needSync
2820: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2830: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66   /* True if an f
2840: 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64  sync() is needed
2850: 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
2860: 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61 63  */.  u8 dirtyCac
2870: 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  he;             
2880: 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63 68   /* True if cach
2890: 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63 68  ed pages have ch
28a0: 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c  anged */.  u8 al
28b0: 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20  waysRollback;   
28c0: 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c         /* Disabl
28d0: 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
28e0: 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  ) for all pages 
28f0: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
2920: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
2930: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2940: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2950: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
2960: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
2970: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
2980: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65   */.  int dbSize
2990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
29b0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
29c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
29d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
29e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
29f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
2a00: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
2a10: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
2a20: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2a30: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
2a40: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
2a50: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  gin() */.  int n
2a60: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
2a70: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a80: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
2a90: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
2aa0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
2ab0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
2ac0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
2ad0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
2ae0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
2af0: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65  */.  int stmtNRe
2b00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2b10: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
2b20: 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75  cords in stmt su
2b30: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  bjournal */.  in
2b40: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
2b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2b60: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
2b70: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
2b80: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
2b90: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
2ba0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2bb0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
2bc0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
2bd0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2be0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
2bf0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
2c00: 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ory pages */.  i
2c10: 6e 74 20 6e 4d 61 78 50 61 67 65 3b 20 20 20 20  nt nMaxPage;    
2c20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69             /* Hi
2c30: 67 68 20 77 61 74 65 72 20 6d 61 72 6b 20 6f 66  gh water mark of
2c40: 20 6e 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   nPage */.  int 
2c50: 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20 20  nRef;           
2c60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2c70: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
2c80: 61 67 65 73 20 77 69 74 68 20 50 67 48 64 72 2e  ages with PgHdr.
2c90: 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20  nRef>0 */.  int 
2ca0: 6d 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  mxPage;         
2cb0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
2cc0: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  um number of pag
2cd0: 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61  es to hold in ca
2ce0: 63 68 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e  che */.  u8 *aIn
2cf0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
2d00: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
2d10: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
2d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2d30: 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 53  le */.  u8 *aInS
2d40: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
2d50: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
2d60: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
2d70: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
2d80: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
2d90: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
2da0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2db0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2dc0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2de0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
2df0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
2e00: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
2e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
2e20: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
2e30: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
2e40: 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c  files */.  OsFil
2e50: 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20  e *fd, *jfd;    
2e60: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2e70: 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 64  escriptors for d
2e80: 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72  atabase and jour
2e90: 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20  nal */.  OsFile 
2ea0: 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20 20 20  *stfd;          
2eb0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2ec0: 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20  criptor for the 
2ed0: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
2ee0: 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79 48 61 6e  rnal*/.  BusyHan
2ef0: 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c  dler *pBusyHandl
2f00: 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  er;  /* Pointer 
2f10: 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48 61  to sqlite.busyHa
2f20: 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64 72  ndler */.  PgHdr
2f30: 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73 74   *pFirst, *pLast
2f40: 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ;      /* List o
2f50: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
2f60: 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 53    PgHdr *pFirstS
2f70: 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f 2a  ynced;        /*
2f80: 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67 65   First free page
2f90: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65 64   with PgHdr.need
2fa0: 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48  Sync==0 */.  PgH
2fb0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
2fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2fd0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
2fe0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3000: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
3010: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
3020: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
3030: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b   i64 journalOff;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3050: 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66 66  Current byte off
3060: 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  set in the journ
3070: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
3080: 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20 20   journalHdr;    
3090: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
30a0: 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76 69   offset to previ
30b0: 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ous journal head
30c0: 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  er */.  i64 stmt
30d0: 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20  HdrOff;         
30e0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75      /* First jou
30f0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
3100: 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  ten this stateme
3110: 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74  nt */.  i64 stmt
3120: 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  Cksum;          
3130: 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74      /* cksumInit
3140: 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74 20   when statement 
3150: 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  was started */. 
3160: 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20   i64 stmtJSize; 
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
3190: 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20  at stmt_begin() 
31a0: 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  */.  int sectorS
31b0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
31c0: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
31d0: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
31e0: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64 65  ollback */.#ifde
31f0: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
3200: 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c  int nHit, nMiss,
3210: 20 6e 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43   nOvfl;     /* C
3220: 61 63 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69  ache hits, missi
3230: 6e 67 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72  ng, and LRU over
3240: 66 6c 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  flows */.  int n
3250: 52 65 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20  Read,nWrite;    
3260: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
3270: 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77 72  se pages read/wr
3280: 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  itten */.#endif.
3290: 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75    void (*xDestru
32a0: 63 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29  ctor)(void*,int)
32b0: 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72  ; /* Call this r
32c0: 6f 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65  outine when free
32d0: 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76  ing pages */.  v
32e0: 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29  oid (*xReiniter)
32f0: 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f  (void*,int);   /
3300: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
3310: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
3320: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
3330: 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
3340: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3350: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3360: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3370: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3380: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
3390: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
33a0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
33b0: 28 29 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61  () */.  PgHdr *a
33c0: 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b  Hash[N_PG_HASH];
33d0: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
33e0: 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75  e to map page nu
33f0: 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f  mber to PgHdr */
3400: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3410: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  OMIT_MEMORY_MANA
3420: 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a  GEMENT.  Pager *
3430: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
3440: 20 20 20 20 20 2f 2a 20 4c 69 6e 6b 65 64 20 6c       /* Linked l
3450: 69 73 74 20 6f 66 20 70 61 67 65 72 73 20 69 6e  ist of pagers in
3460: 20 74 68 69 73 20 74 68 72 65 61 64 20 2a 2f 0a   this thread */.
3470: 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  #endif.};../*.**
3480: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
3490: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
34a0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
34b0: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
34c0: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
34d0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
34e0: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
34f0: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3500: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3510: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3520: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
3530: 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63   are bits that c
3540: 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67  an be set in Pag
3550: 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2a 0a 2a  er.errMask..**.*
3560: 2a 20 54 4f 44 4f 3a 20 4d 61 79 62 65 20 77 65  * TODO: Maybe we
3570: 20 6a 75 73 74 20 77 61 6e 74 20 61 20 76 61 72   just want a var
3580: 69 61 62 6c 65 20 2d 20 50 61 67 65 72 2e 65 72  iable - Pager.er
3590: 72 43 6f 64 65 2e 20 43 61 6e 20 77 65 20 72 65  rCode. Can we re
35a0: 61 6c 6c 79 20 0a 2a 2a 20 20 20 20 20 20 20 68  ally .**       h
35b0: 61 76 65 20 74 77 6f 20 73 69 6d 75 6c 74 61 6e  ave two simultan
35c0: 65 6f 75 73 20 65 72 72 6f 72 20 63 6f 6e 64 69  eous error condi
35d0: 74 69 6f 6e 73 3f 0a 2a 2a 0a 2a 2a 20 52 65 63  tions?.**.** Rec
35e0: 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 61 6e 20  overing from an 
35f0: 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 53 51 4c  SQLITE_FULL, SQL
3600: 49 54 45 5f 4c 4f 43 4b 2c 20 53 51 4c 49 54 45  ITE_LOCK, SQLITE
3610: 5f 43 4f 52 52 55 50 54 20 6f 72 20 0a 2a 2a 20  _CORRUPT or .** 
3620: 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 65 72 72  SQLITE_IOERR err
3630: 6f 72 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70  or is not a simp
3640: 6c 65 20 6d 61 74 74 65 72 2c 20 70 61 72 74 69  le matter, parti
3650: 63 75 6c 61 72 6c 79 20 69 66 20 74 68 65 20 70  cularly if the p
3660: 61 67 65 72 20 0a 2a 2a 20 63 61 63 68 65 20 69  ager .** cache i
3670: 73 20 73 68 61 72 65 64 20 62 65 74 77 65 65 6e  s shared between
3680: 20 6d 75 6c 74 69 70 6c 65 20 63 6f 6e 6e 65 63   multiple connec
3690: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  tions..**.** SQL
36a0: 49 54 45 5f 46 55 4c 4c 20 28 50 41 47 45 52 5f  ITE_FULL (PAGER_
36b0: 45 52 52 5f 46 55 4c 4c 29 3a 0a 2a 2a 20 20 20  ERR_FULL):.**   
36c0: 20 20 43 6c 65 61 72 65 64 20 77 68 65 6e 20 74    Cleared when t
36d0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
36e0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
36f0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52  *.** SQLITE_CORR
3700: 55 50 54 20 28 50 41 47 45 52 5f 45 52 52 5f 43  UPT (PAGER_ERR_C
3710: 4f 52 52 55 50 54 29 3a 0a 2a 2a 20 20 20 20 20  ORRUPT):.**     
3720: 43 61 6e 6e 6f 74 20 62 65 20 63 6c 65 61 72 65  Cannot be cleare
3730: 64 2e 20 54 68 65 20 75 70 70 65 72 20 6c 61 79  d. The upper lay
3740: 65 72 20 6d 75 73 74 20 63 6c 6f 73 65 20 74 68  er must close th
3750: 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 72 20  e current pager 
3760: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 6f 70 65 6e  .**     and open
3770: 20 61 20 6e 65 77 20 6f 6e 65 20 6f 6e 20 74 68   a new one on th
3780: 65 20 73 61 6d 65 20 66 69 6c 65 20 74 6f 20 63  e same file to c
3790: 6f 6e 74 69 6e 75 65 2e 0a 2a 2a 0a 2a 2a 20 53  ontinue..**.** S
37a0: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 28  QLITE_PROTOCOL (
37b0: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 29 3a  PAGER_ERR_LOCK):
37c0: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 65 72 72  .**     This err
37d0: 6f 72 20 6f 6e 6c 79 20 6f 63 63 75 72 73 20 69  or only occurs i
37e0: 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72  f an internal er
37f0: 72 6f 72 20 6f 63 63 75 72 73 20 6f 72 20 61 6e  ror occurs or an
3800: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 0a 2a  other process .*
3810: 2a 20 20 20 20 20 69 73 20 6e 6f 74 20 66 6f 6c  *     is not fol
3820: 6c 6f 77 69 6e 67 20 74 68 65 20 73 71 6c 69 74  lowing the sqlit
3830: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  e locking protoc
3840: 6f 6c 20 28 69 2e 65 2e 20 73 6f 6d 65 6f 6e 65  ol (i.e. someone
3850: 20 69 73 20 0a 2a 2a 20 20 20 20 20 6d 61 6e 69   is .**     mani
3860: 70 75 6c 61 74 69 6e 67 20 74 68 65 20 64 61 74  pulating the dat
3870: 61 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67  abase file using
3880: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
3890: 20 74 68 61 6e 20 73 71 6c 69 74 65 29 2e 0a 2a   than sqlite)..*
38a0: 2a 20 20 20 20 20 54 68 69 73 20 69 73 20 68 61  *     This is ha
38b0: 6e 64 6c 65 64 20 69 6e 20 74 68 65 20 73 61 6d  ndled in the sam
38c0: 65 20 77 61 79 20 61 73 20 64 61 74 61 62 61 73  e way as databas
38d0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 2d 20 74  e corruption - t
38e0: 68 65 20 65 72 72 6f 72 20 0a 2a 2a 20 20 20 20  he error .**    
38f0: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 65 61 72   cannot be clear
3900: 65 64 20 65 78 63 65 70 74 20 62 79 20 63 6c 6f  ed except by clo
3910: 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
3920: 20 70 61 67 65 72 20 61 6e 64 20 6f 70 65 6e 69   pager and openi
3930: 6e 67 20 0a 2a 2a 20 20 20 20 20 61 20 62 72 61  ng .**     a bra
3940: 6e 64 20 6e 65 77 20 6f 6e 65 20 6f 6e 20 74 68  nd new one on th
3950: 65 20 73 61 6d 65 20 66 69 6c 65 2e 0a 2a 2a 0a  e same file..**.
3960: 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  ** SQLITE_IOERR 
3970: 28 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 29  (PAGER_ERR_DISK)
3980: 3a 0a 2a 2a 20 20 20 20 20 43 6c 65 61 72 65 64  :.**     Cleared
3990: 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61   when the transa
39a0: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
39b0: 62 61 63 6b 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  back..*/.#define
39c0: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
39d0: 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61 20 77      0x01  /* a w
39e0: 72 69 74 65 28 29 20 66 61 69 6c 65 64 20 2a 2f  rite() failed */
39f0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
3a00: 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 32  RR_LOCK     0x02
3a10: 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68    /* error in th
3a20: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  e locking protoc
3a30: 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  ol */.#define PA
3a40: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
3a50: 20 30 78 30 34 20 20 2f 2a 20 64 61 74 61 62 61   0x04  /* databa
3a60: 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f  se or journal co
3a70: 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66  rruption */.#def
3a80: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49  ine PAGER_ERR_DI
3a90: 53 4b 20 20 20 20 20 30 78 30 38 20 20 2f 2a 20  SK     0x08  /* 
3aa0: 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f  general disk I/O
3ab0: 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72   error - bad har
3ac0: 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a  d drive? */../*.
3ad0: 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  ** Journal files
3ae0: 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20   begin with the 
3af0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20  following magic 
3b00: 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74  string.  The dat
3b10: 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65  a.** was obtaine
3b20: 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64  d from /dev/rand
3b30: 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20  om.  It is used 
3b40: 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79  only as a sanity
3b50: 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69   check..**.** Si
3b60: 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e  nce version 2.8.
3b70: 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  0, the journal f
3b80: 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61  ormat contains a
3b90: 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79  dditional sanity
3ba0: 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  .** checking inf
3bb0: 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68  ormation.  If th
3bc0: 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68  e power fails wh
3bd0: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
3be0: 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74  is begin.** writ
3bf0: 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d  ten, semi-random
3c00: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69   garbage data mi
3c10: 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68  ght appear in th
3c20: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
3c30: 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73  e after power is
3c40: 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61   restored.  If a
3c50: 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65  n attempt is the
3c60: 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c  n made.** to rol
3c70: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61  l the journal ba
3c80: 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  ck, the database
3c90: 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70   could be corrup
3ca0: 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69  ted.  The additi
3cb0: 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63  onal.** sanity c
3cc0: 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20  hecking data is 
3cd0: 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69  an attempt to di
3ce0: 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61  scover the garba
3cf0: 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  ge in the.** jou
3d00: 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20  rnal and ignore 
3d10: 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61  it..**.** The sa
3d20: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e  nity checking in
3d30: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
3d40: 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f  e new journal fo
3d50: 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a  rmat consists.**
3d60: 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65   of a 32-bit che
3d70: 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61  cksum on each pa
3d80: 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65  ge of data.  The
3d90: 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73   checksum covers
3da0: 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67   both.** the pag
3db0: 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65  e number and the
3dc0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
3dd0: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  e bytes of data 
3de0: 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a  for the page..**
3df0: 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69   This cksum is i
3e00: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
3e10: 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61  32-bit random va
3e20: 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73  lue that appears
3e30: 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   in the.** journ
3e40: 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66  al file right af
3e50: 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20  ter the header. 
3e60: 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74   The random init
3e70: 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72  ializer is impor
3e80: 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65  tant,.** because
3e90: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68   garbage data th
3ea0: 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68  at appears at th
3eb0: 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e  e end of a journ
3ec0: 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20  al is likely.** 
3ed0: 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e  data that was on
3ee0: 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65  ce in other file
3ef0: 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20  s that have now 
3f00: 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49  been deleted.  I
3f10: 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65  f the.** garbage
3f20: 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20   data came from 
3f30: 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72  an obsolete jour
3f40: 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68  nal file, the ch
3f50: 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a  ecksums might.**
3f60: 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75   be correct.  Bu
3f70: 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  t by initializin
3f80: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74  g the checksum t
3f90: 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77  o random value w
3fa0: 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65  hich.** is diffe
3fb0: 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a  rent for every j
3fc0: 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d  ournal, we minim
3fd0: 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a  ize that risk..*
3fe0: 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
3ff0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f  nsigned char aJo
4000: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b  urnalMagic[] = {
4010: 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30  .  0xd9, 0xd5, 0
4020: 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c  x05, 0xf9, 0x20,
4030: 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64   0xa1, 0x63, 0xd
4040: 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  7,.};../*.** The
4050: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
4060: 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20  der and of each 
4070: 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  page in the jour
4080: 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65  nal is determine
4090: 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c  d.** by the foll
40a0: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f  owing macros..*/
40b0: 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c  .#define JOURNAL
40c0: 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20  _PG_SZ(pPager)  
40d0: 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ((pPager->pageSi
40e0: 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20  ze) + 8)../*.** 
40f0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
4100: 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  er size for this
4110: 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66   pager. In the f
4120: 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c  uture, this coul
4130: 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73  d be.** set to s
4140: 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  ome value read f
4150: 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e  rom the disk con
4160: 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70  troller. The imp
4170: 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63  ortant.** charac
4180: 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74  teristic is that
4190: 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20   it is the same 
41a0: 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73  size as a disk s
41b0: 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ector..*/.#defin
41c0: 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  e JOURNAL_HDR_SZ
41d0: 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72  (pPager) (pPager
41e0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f  ->sectorSize)../
41f0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d  *.** The macro M
4200: 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20  EMDB is true if 
4210: 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
4220: 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ith an in-memory
4230: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65   database..** We
4240: 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61   do this as a ma
4250: 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74  cro so that if t
4260: 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  he SQLITE_OMIT_M
4270: 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73  EMORYDB macro is
4280: 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c   set,.** the val
4290: 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c  ue of MEMDB will
42a0: 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61   be a constant a
42b0: 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  nd the compiler 
42c0: 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a  will optimize.**
42d0: 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77   out code that w
42e0: 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75  ould never execu
42f0: 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  te..*/.#ifdef SQ
4300: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
4310: 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  DB.# define MEMD
4320: 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  B 0.#else.# defi
4330: 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d  ne MEMDB pPager-
4340: 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f  >memDb.#endif../
4350: 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
4360: 20 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20   size of a disk 
4370: 73 65 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e  sector.*/.#defin
4380: 65 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  e PAGER_SECTOR_S
4390: 49 5a 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50  IZE 512../*.** P
43a0: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
43b0: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
43c0: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
43d0: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
43e0: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
43f0: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
4400: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
4410: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
4420: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
4430: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
4440: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
4450: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
4460: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
4470: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
4480: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
4490: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
44a0: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
44b0: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
44c0: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
44d0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
44e0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
44f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
4500: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
4510: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
4520: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
4530: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
4540: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
4550: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
4560: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
4570: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
4580: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
4590: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
45a0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
45b0: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
45c0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
45d0: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
45e0: 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72  ../*.** Enable r
45f0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74  eference count t
4600: 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62  racking (for deb
4610: 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f  ugging) here:.*/
4620: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
4630: 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72  EBUG.  int pager
4640: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
4650: 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76   = 0;.  static v
4660: 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66  oid pager_refinf
4670: 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20  o(PgHdr *p){.   
4680: 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20   static int cnt 
4690: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61  = 0;.    if( !pa
46a0: 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61  ger3_refinfo_ena
46b0: 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ble ) return;.  
46c0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
46d0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45  intf(.       "RE
46e0: 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25  FCNT: %4d addr=%
46f0: 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20  p nRef=%d\n",.  
4700: 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47       p->pgno, PG
4710: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
4720: 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20  p->nRef.    );. 
4730: 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53     cnt++;   /* S
4740: 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20  omething to set 
4750: 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20  a breakpoint on 
4760: 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20  */.  }.# define 
4770: 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65  REFINFO(X)  page
4780: 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c  r_refinfo(X).#el
4790: 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49  se.# define REFI
47a0: 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  NFO(X).#endif../
47b0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
47c0: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
47d0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
47e0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
47f0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
4800: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
4810: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
4820: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
4830: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
4840: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
4850: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4860: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
4870: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
4880: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
4890: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
48a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
48b0: 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20  ad32bits(OsFile 
48c0: 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  *fd, u32 *pRes){
48d0: 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e  .  u32 res;.  in
48e0: 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  t rc;.  rc = sql
48f0: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 26  ite3OsRead(fd, &
4900: 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29  res, sizeof(res)
4910: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
4920: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e  ITE_OK ){.    un
4930: 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34  signed char ac[4
4940: 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 63  ];.    memcpy(ac
4950: 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20 20 20  , &res, 4);.    
4960: 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34  res = (ac[0]<<24
4970: 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20  ) | (ac[1]<<16) 
4980: 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61  | (ac[2]<<8) | a
4990: 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65  c[3];.  }.  *pRe
49a0: 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74 75 72  s = res;.  retur
49b0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
49c0: 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e  rite a 32-bit in
49d0: 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67  teger into the g
49e0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
49f0: 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ptor.  Return SQ
4a00: 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
4a10: 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f  ccess or an erro
4a20: 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68  r code is someth
4a30: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
4a40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
4a50: 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ite32bits(OsFile
4a60: 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a   *fd, u32 val){.
4a70: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4a80: 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d  ac[4];.  ac[0] =
4a90: 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66   (val>>24) & 0xf
4aa0: 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61  f;.  ac[1] = (va
4ab0: 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20  l>>16) & 0xff;. 
4ac0: 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38   ac[2] = (val>>8
4ad0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33  ) & 0xff;.  ac[3
4ae0: 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a  ] = val & 0xff;.
4af0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4b00: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
4b10: 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  4);.}../*.** Wri
4b20: 74 65 20 74 68 65 20 33 32 2d 62 69 74 20 69 6e  te the 32-bit in
4b30: 74 65 67 65 72 20 27 76 61 6c 27 20 69 6e 74 6f  teger 'val' into
4b40: 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69   the page identi
4b50: 66 69 65 64 20 62 79 20 70 61 67 65 20 68 65 61  fied by page hea
4b60: 64 65 72 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66  der.** 'p' at of
4b70: 66 73 65 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a  fset 'offset'..*
4b80: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
4b90: 6f 72 65 33 32 62 69 74 73 28 75 33 32 20 76 61  ore32bits(u32 va
4ba0: 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69 6e 74  l, PgHdr *p, int
4bb0: 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69   offset){.  unsi
4bc0: 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20  gned char *ac;. 
4bd0: 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65   ac = &((unsigne
4be0: 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  d char*)PGHDR_TO
4bf0: 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74  _DATA(p))[offset
4c00: 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61  ];.  ac[0] = (va
4c10: 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20  l>>24) & 0xff;. 
4c20: 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31   ac[1] = (val>>1
4c30: 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  6) & 0xff;.  ac[
4c40: 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20  2] = (val>>8) & 
4c50: 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20  0xff;.  ac[3] = 
4c60: 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f  val & 0xff;.}../
4c70: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
4c80: 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66  it integer at of
4c90: 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72  fset 'offset' fr
4ca0: 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  om the page iden
4cb0: 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67  tified by.** pag
4cc0: 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f  e header 'p'..*/
4cd0: 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72  .static u32 retr
4ce0: 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72  ieve32bits(PgHdr
4cf0: 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29   *p, int offset)
4d00: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4d10: 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28  r *ac;.  ac = &(
4d20: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
4d30: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4d40: 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74  )[offset];.  ret
4d50: 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20  urn (ac[0]<<24) 
4d60: 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20  | (ac[1]<<16) | 
4d70: 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b  (ac[2]<<8) | ac[
4d80: 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  3];.}.../*.** Co
4d90: 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20 69  nvert the bits i
4da0: 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  n the pPager->er
4db0: 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70  rMask into an ap
4dc0: 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75  proprate.** retu
4dd0: 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  rn code..*/.stat
4de0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72  ic int pager_err
4df0: 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  code(Pager *pPag
4e00: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
4e10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
4e20: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4e30: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43   & PAGER_ERR_LOC
4e40: 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K )    rc = SQLI
4e50: 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69  TE_PROTOCOL;.  i
4e60: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
4e70: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44  sk & PAGER_ERR_D
4e80: 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51  ISK )    rc = SQ
4e90: 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66  LITE_IOERR;.  if
4ea0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
4eb0: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55  k & PAGER_ERR_FU
4ec0: 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  LL )    rc = SQL
4ed0: 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20  ITE_FULL;.  if( 
4ee0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4ef0: 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  & PAGER_ERR_CORR
4f00: 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UPT ) rc = SQLIT
4f10: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74  E_CORRUPT;.  ret
4f20: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4f30: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
4f40: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
4f50: 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f 63  when an error oc
4f60: 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
4f70: 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 20 74 6f  pager.** code to
4f80: 20 73 65 74 20 74 68 65 20 61 70 70 72 6f 70 72   set the appropr
4f90: 69 61 74 65 20 62 69 74 73 20 69 6e 20 50 61 67  iate bits in Pag
4fa0: 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 73  er.errMask..*/.s
4fb0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
4fc0: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
4fd0: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
4fe0: 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20  switch( rc ){.  
4ff0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52    case SQLITE_PR
5000: 4f 54 4f 43 4f 4c 3a 0a 20 20 20 20 20 20 70 50  OTOCOL:.      pP
5010: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
5020: 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 3b   PAGER_ERR_LOCK;
5030: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5040: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
5050: 45 52 52 3a 0a 20 20 20 20 20 20 70 50 61 67 65  ERR:.      pPage
5060: 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
5070: 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20  GER_ERR_DISK;.  
5080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5090: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
50a0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
50b0: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
50c0: 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20  ERR_FULL;.      
50d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
50e0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 0a  SQLITE_CORRUPT:.
50f0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
5100: 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45  rMask |= PAGER_E
5110: 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  RR_CORRUPT;.    
5120: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72    break;.  }.  r
5130: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
5140: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
5150: 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74  _PAGES./*.** Ret
5160: 75 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73  urn a 32-bit has
5170: 68 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61  h of the page da
5180: 74 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f  ta for pPage..*/
5190: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
51a0: 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72  r_pagehash(PgHdr
51b0: 20 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20   *pPage){.  u32 
51c0: 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20  hash = 0;.  int 
51d0: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
51e0: 61 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73  ar *pData = (uns
51f0: 69 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48  igned char *)PGH
5200: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65  DR_TO_DATA(pPage
5210: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5220: 70 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70  pPage->pPager->p
5230: 61 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20  ageSize; i++){. 
5240: 20 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b     hash = (hash+
5250: 69 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d  i)^pData[i];.  }
5260: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
5270: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45  }../*.** The CHE
5280: 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61  CK_PAGE macro ta
5290: 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20  kes a PgHdr* as 
52a0: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20  an argument. If 
52b0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
52c0: 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64  ES.** is defined
52d0: 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20  , and NDEBUG is 
52e0: 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20  not defined, an 
52f0: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
5300: 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61  nt checks.** tha
5310: 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69  t the page is ei
5320: 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74  ther dirty or st
5330: 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20  ill matches the 
5340: 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d  calculated page-
5350: 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  hash..*/.#define
5360: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63   CHECK_PAGE(x) c
5370: 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74  heckPage(x).stat
5380: 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67  ic void checkPag
5390: 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
53a0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
53b0: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
53c0: 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61  assert( !pPg->pa
53d0: 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72  geHash || pPager
53e0: 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 4d 45 4d  ->errMask || MEM
53f0: 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79  DB || pPg->dirty
5400: 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e   || .      pPg->
5410: 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f  pageHash==pager_
5420: 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b  pagehash(pPg) );
5430: 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  .}..#else.#defin
5440: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a  e CHECK_PAGE(x).
5450: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68  #endif../*.** Wh
5460: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
5470: 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  d the journal fi
5480: 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61  le for pager pPa
5490: 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ger must be open
54a0: 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  ..** The master 
54b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
54c0: 65 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  e is read from t
54d0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
54e0: 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74  le and .** writt
54f0: 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
5500: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
5510: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a  iteMalloc(). *pz
5520: 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74  Master is.** set
5530: 20 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65   to point at the
5540: 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49   memory and SQLI
5550: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20  TE_OK returned. 
5560: 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a  The caller must.
5570: 2a 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20  ** sqliteFree() 
5580: 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a  *pzMaster..**.**
5590: 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f   If no master jo
55a0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
55b0: 69 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61  is present *pzMa
55c0: 73 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30  ster is set to 0
55d0: 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f   and.** SQLITE_O
55e0: 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  K returned..*/.s
55f0: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61  tatic int readMa
5600: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69  sterJournal(OsFi
5610: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
5620: 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  **pzMaster){.  i
5630: 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e  nt rc;.  u32 len
5640: 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75  ;.  i64 szJ;.  u
5650: 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20  32 cksum;.  int 
5660: 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  i;.  unsigned ch
5670: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
5680: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
5690: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
56a0: 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74  er */..  *pzMast
56b0: 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20  er = 0;..  rc = 
56c0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
56d0: 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a  e(pJrnl, &szJ);.
56e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
56f0: 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20  _OK || szJ<16 ) 
5700: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5710: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
5720: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b  (pJrnl, szJ-16);
5730: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5740: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
5750: 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33  ;. .  rc = read3
5760: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65  2bits(pJrnl, &le
5770: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
5780: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
5790: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61   rc;..  rc = rea
57a0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26  d32bits(pJrnl, &
57b0: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
57c0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
57d0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
57e0: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
57f0: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29  Jrnl, aMagic, 8)
5800: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5810: 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28  TE_OK || memcmp(
5820: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
5830: 4d 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75  Magic, 8) ) retu
5840: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
5850: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72  qlite3OsSeek(pJr
5860: 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b  nl, szJ-16-len);
5870: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5880: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
5890: 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  ;..  *pzMaster =
58a0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
58b0: 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20  alloc(len+1);.  
58c0: 69 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29  if( !*pzMaster )
58d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
58e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
58f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
5900: 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61  ead(pJrnl, *pzMa
5910: 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66  ster, len);.  if
5920: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5930: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
5940: 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20  e(*pzMaster);.  
5950: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b    *pzMaster = 0;
5960: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
5970: 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66    }..  /* See if
5980: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61   the checksum ma
5990: 74 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72  tches the master
59a0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f   journal name */
59b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
59c0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
59d0: 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72  um -= (*pzMaster
59e0: 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20  )[i];.  }.  if( 
59f0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
5a00: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
5a10: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
5a20: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
5a30: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
5a40: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
5a50: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
5a60: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
5a70: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
5a80: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
5a90: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
5aa0: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
5ab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
5ac0: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
5ad0: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
5ae0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
5af0: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
5b00: 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61  sqliteFree(*pzMa
5b10: 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61  ster);.    *pzMa
5b20: 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  ster = 0;.  }els
5b30: 65 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65  e{.    (*pzMaste
5b40: 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a  r)[len] = '\0';.
5b50: 20 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e    }.   .  return
5b60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
5b70: 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f  *.** Seek the jo
5b80: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
5b90: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  iptor to the nex
5ba0: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
5bb0: 79 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75  y where a.** jou
5bc0: 72 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20  rnal header may 
5bd0: 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
5be0: 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61  en. Pager.journa
5bf0: 6c 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20  lOff is updated 
5c00: 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20  with.** the new 
5c10: 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a  seek offset..**.
5c20: 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63  ** i.e for a sec
5c30: 74 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a  tor size of 512:
5c40: 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66  .**.** Input Off
5c50: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
5c60: 20 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a   Output Offset.*
5c70: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20  ---------.** 0  
5ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cb0: 20 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20         0.** 512 
5cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cd0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30        512.** 100
5ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5cf0: 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30         512.** 20
5d00: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
5d10: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
5d20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5d30: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
5d40: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
5d50: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
5d60: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
5d70: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
5d80: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
5d90: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
5da0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5db0: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
5dc0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5dd0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
5de0: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
5df0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
5e00: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
5e10: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
5e20: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
5e30: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
5e40: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
5e50: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
5e60: 3d 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75  = offset;.  retu
5e70: 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  rn sqlite3OsSeek
5e80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
5e90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5ea0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
5eb0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
5ec0: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
5ed0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5ee0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
5ef0: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
5f00: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
5f10: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
5f20: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
5f30: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
5f40: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
5f50: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
5f60: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
5f70: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
5f80: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
5f90: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
5fa0: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
5fb0: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
5fc0: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
5fd0: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
5fe0: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
5ff0: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
6000: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
6010: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
6020: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
6030: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
6040: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
6050: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
6060: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
6070: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
6080: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
6090: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
60a0: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
60b0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
60c0: 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20   - 24) bytes of 
60d0: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
60e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
60f0: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
6100: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 69  r *pPager){..  i
6110: 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  nt rc = seekJour
6120: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
6130: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
6140: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
6150: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
6160: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6170: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
6180: 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b  stmtHdrOff==0 ){
6190: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
61a0: 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  tHdrOff = pPager
61b0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20  ->journalHdr;.  
61c0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
61d0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
61e0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
61f0: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
6200: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
6210: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
6220: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
6230: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
6240: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
6250: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
6260: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
6270: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
6280: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
6290: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
62a0: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
62b0: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
62c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
62d0: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
62e0: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
62f0: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
6300: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63   this..  */.  rc
6310: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6320: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  e(pPager->jfd, a
6330: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
6340: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
6350: 69 63 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  ic));..  if( rc=
6360: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6370: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
6380: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
6390: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
63a0: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20  nals. */.    rc 
63b0: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
63c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
63d0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
63e0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d  ffffff : 0);.  }
63f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
6400: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
6410: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
6420: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
6430: 20 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74 65 33   */ .    sqlite3
6440: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
6450: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
6460: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
6470: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72  ksumInit);.    r
6480: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
6490: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
64a0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
64b0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
64c0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
64d0: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
64e0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
64f0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
6500: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6510: 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  , pPager->dbSize
6520: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
6530: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6540: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
6550: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
6560: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
6570: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
6580: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
6590: 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  d, pPager->secto
65a0: 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rSize);.  }..  /
65b0: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
65c0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
65d0: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
65e0: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
65f0: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
6600: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
6610: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
6620: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
6630: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
6640: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
6650: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
6660: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66  sSeek(pPager->jf
6670: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6680: 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69 66  alOff-1);.    if
6690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
66a0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
66b0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
66c0: 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22  ger->jfd, "\000"
66d0: 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 1);.    }.  }.
66e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
66f0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
6700: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
6710: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
6720: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
6730: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
6740: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
6750: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
6760: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
6770: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
6780: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
6790: 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  e. See comments 
67a0: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
67b0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
67c0: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
67d0: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75  on of.** the jou
67e0: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
67f0: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
6800: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
6810: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
6820: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
6830: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
6840: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
6850: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
6860: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
6870: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
6880: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
6890: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
68a0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
68b0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
68c0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
68d0: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
68e0: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
68f0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
6900: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
6910: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
6920: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
6930: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
6940: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
6950: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
6960: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
6970: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
6980: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
6990: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e  nd *dbSize are n
69a0: 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52  ot set.  If JOUR
69b0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
69c0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
69d0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
69e0: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
69f0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
6a00: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
6a10: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
6a20: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
6a30: 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  r, .  i64 journa
6a40: 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e  lSize,.  u32 *pN
6a50: 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62  Rec, .  u32 *pDb
6a60: 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Size.){.  int rc
6a70: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
6a80: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
6a90: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
6aa0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
6ab0: 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65  r */..  rc = see
6ac0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
6ad0: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
6ae0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6af0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
6b00: 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lOff+JOURNAL_HDR
6b10: 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f  _SZ(pPager) > jo
6b20: 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20  urnalSize ){.   
6b30: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
6b40: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
6b50: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
6b60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
6b70: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6b80: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c));.  if( rc ) 
6b90: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6ba0: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6bb0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
6bc0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
6bd0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
6be0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
6bf0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
6c00: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
6c10: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
6c20: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6c30: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
6c40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
6c50: 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  &pPager->cksumIn
6c60: 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  it);.  if( rc ) 
6c70: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6c80: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50   = read32bits(pP
6c90: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69  ager->jfd, pDbSi
6ca0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
6cb0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
6cc0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
6cd0: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
6ce0: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
6cf0: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
6d00: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6d10: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
6d20: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
6d30: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
6d40: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
6d50: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
6d60: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
6d70: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
6d80: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
6d90: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
6da0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
6db0: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
6dc0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
6dd0: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
6de0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
6df0: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
6e00: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
6e10: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
6e20: 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61  jfd, (u32 *)&pPa
6e30: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
6e40: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
6e50: 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65  urn rc;..  pPage
6e60: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
6e70: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
6e80: 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
6e90: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
6ea0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6eb0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
6ec0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6ed0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
6ee0: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
6ef0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
6f00: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6f10: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
6f20: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
6f30: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
6f40: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
6f50: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
6f60: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
6f70: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
6f80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
6f90: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
6fa0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
6fb0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
6fc0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6fd0: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
6fe0: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
6ff0: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
7000: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
7010: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
7020: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20  t is:.**.** + 4 
7030: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
7040: 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74  PGNO..** + N byt
7050: 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61  es: length of ma
7060: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
7070: 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  e..** + 4 bytes:
7080: 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a   N.** + 4 bytes:
7090: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
70a0: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
70b0: 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f  * + 8 bytes: aJo
70c0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
70d0: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
70e0: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
70f0: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
7100: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
7110: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
7120: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a  urnal name..**.*
7130: 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20  * If zMaster is 
7140: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28  a NULL pointer (
7150: 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e  occurs for a sin
7160: 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
7170: 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74  nsaction), .** t
7180: 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f  his call is a no
7190: 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
71a0: 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  nt writeMasterJo
71b0: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
71c0: 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
71d0: 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74  *zMaster){.  int
71e0: 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20   rc;.  int len; 
71f0: 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32  .  int i; .  u32
7200: 20 63 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a 20 20   cksum = 0; ..  
7210: 69 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20  if( !zMaster || 
7220: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
7230: 72 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r) return SQLITE
7240: 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  _OK;.  pPager->s
7250: 65 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20  etMaster = 1;.. 
7260: 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d   len = strlen(zM
7270: 61 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d  aster);.  for(i=
7280: 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a  0; i<len; i++){.
7290: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
72a0: 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20  ster[i];.  }..  
72b0: 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79  /* If in full-sy
72c0: 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65  nc mode, advance
72d0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73   to the next dis
72e0: 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20  k sector before 
72f0: 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  writing.  ** the
7300: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
7310: 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e  name. This is in
7320: 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f   case the previo
7330: 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  us page written 
7340: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  to.  ** the jour
7350: 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20  nal has already 
7360: 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a  been synced..  *
7370: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
7380: 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
7390: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
73a0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
73b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
73c0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
73d0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
73e0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e  urnalOff += (len
73f0: 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72  +20);..  rc = wr
7400: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
7410: 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f  ->jfd, PAGER_MJ_
7420: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
7430: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
7440: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
7450: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
7460: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
7470: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
7480: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7490: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
74a0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  rc;..  rc = writ
74b0: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
74c0: 6a 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  jfd, len);.  if(
74d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
74e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
74f0: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
7500: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73  pPager->jfd, cks
7510: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
7520: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
7530: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
7540: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
7550: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
7560: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
7570: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
7580: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
7590: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
75a0: 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20  oSync;.  return 
75b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
75c0: 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67   or remove a pag
75d0: 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
75e0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61  of all pages tha
75f0: 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20  t are in the.** 
7600: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
7610: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67  l..**.** The Pag
7620: 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72  er keeps a separ
7630: 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ate list of page
7640: 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  s that are curre
7650: 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ntly in.** the s
7660: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7670: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68  .  This helps th
7680: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  e sqlite3pager_s
7690: 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20  tmt_commit().** 
76a0: 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48  routine run MUCH
76b0: 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20   faster for the 
76c0: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
76d0: 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79  e there are many
76e0: 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d  .** pages in mem
76f0: 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66  ory but only a f
7700: 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ew are in the st
7710: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
7720: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7730: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
7740: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
7750: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
7760: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
7770: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53  ;.  if( pPg->inS
7780: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
7790: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72  assert( pPg->pPr
77a0: 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67  evStmt==0 && pPg
77b0: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29  ->pNextStmt==0 )
77c0: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
77d0: 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  mt = 0;.  if( pP
77e0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  ager->pStmt ){. 
77f0: 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
7800: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
7810: 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
7820: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
7830: 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65  ->pStmt;.  pPage
7840: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a  r->pStmt = pPg;.
7850: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
7860: 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  1;.}.static void
7870: 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
7880: 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  m_stmt_list(PgHd
7890: 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21  r *pPg){.  if( !
78a0: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
78b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
78c0: 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20  >pPrevStmt ){.  
78d0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
78e0: 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53  PrevStmt->pNextS
78f0: 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  tmt==pPg );.    
7900: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
7910: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d  pNextStmt = pPg-
7920: 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65  >pNextStmt;.  }e
7930: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7940: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
7950: 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  tmt==pPg );.    
7960: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74  pPg->pPager->pSt
7970: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
7980: 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  tmt;.  }.  if( p
7990: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b  Pg->pNextStmt ){
79a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
79b0: 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72  ->pNextStmt->pPr
79c0: 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  evStmt==pPg );. 
79d0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d     pPg->pNextStm
79e0: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
79f0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20  Pg->pPrevStmt;. 
7a00: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53   }.  pPg->pNextS
7a10: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  tmt = 0;.  pPg->
7a20: 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20  pPrevStmt = 0;. 
7a30: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
7a40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
7a50: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
7a60: 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
7a70: 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
7a80: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
7a90: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
7aa0: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20   or NULL if not 
7ab0: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
7ac0: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
7ad0: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
7ae0: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
7af0: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61    PgHdr *p = pPa
7b00: 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72  ger->aHash[pager
7b10: 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20  _hash(pgno)];.  
7b20: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70  while( p && p->p
7b30: 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  gno!=pgno ){.   
7b40: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73   p = p->pNextHas
7b50: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  h;.  }.  return 
7b60: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  p;.}../*.** Unlo
7b70: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
7b80: 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e  and clear the in
7b90: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
7ba0: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
7bb0: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
7bc0: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
7bd0: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
7be0: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
7bf0: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
7c00: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
7c10: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
7c20: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
7c30: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
7c40: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
7c50: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
7c60: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
7c70: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
7c80: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
7c90: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
7ca0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
7cb0: 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50  *pNext;.  if( pP
7cc0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 20  ager->errMask ) 
7cd0: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50  return;.  for(pP
7ce0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
7cf0: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
7d00: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
7d10: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
7d20: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
7d30: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
7d40: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
7d50: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
7d60: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
7d70: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
7d80: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
7d90: 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
7da0: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
7db0: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
7dc0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  );.  pPager->nPa
7dd0: 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
7de0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
7df0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
7e00: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
7e10: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
7e20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
7e30: 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  sUnlock(pPager->
7e40: 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
7e50: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
7e60: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
7e70: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
7e80: 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e   -1;.  pPager->n
7e90: 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65 72  Ref = 0;.  asser
7ea0: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
7eb0: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a  alOpen==0 );.}..
7ec0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20  /*.** When this 
7ed0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
7ee0: 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73  d, the pager has
7ef0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7f00: 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20  e open and.** a 
7f10: 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c  RESERVED or EXCL
7f20: 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
7f30: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69  e database.  Thi
7f40: 73 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73  s routine releas
7f50: 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
7f60: 73 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75  se lock and acqu
7f70: 69 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f  ires a SHARED lo
7f80: 63 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e  ck in its place.
7f90: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a    The journal.**
7fa0: 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64   file is deleted
7fb0: 20 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a   and closed..**.
7fc0: 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65  ** TODO: Conside
7fd0: 72 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f  r keeping the jo
7fe0: 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20  urnal file open 
7ff0: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61  for temporary da
8000: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73  tabases..** This
8010: 20 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65   might give a pe
8020: 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76  rformance improv
8030: 65 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73  ement on windows
8040: 20 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a   where opening.*
8050: 2a 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65  * a file is an e
8060: 78 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69  xpensive operati
8070: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
8080: 74 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  t pager_unwritel
8090: 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ock(Pager *pPage
80a0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
80b0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  ;.  int rc;.  as
80c0: 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a  sert( !MEMDB );.
80d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
80e0: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
80f0: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
8100: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
8110: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
8120: 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
8130: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
8140: 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
8150: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
8160: 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b  (&pPager->stfd);
8170: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
8180: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20  tOpen = 0;.  }. 
8190: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
81a0: 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
81b0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
81c0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
81d0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
81e0: 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73  lOpen = 0;.    s
81f0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
8200: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
8210: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
8220: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
8230: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
8240: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
8250: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   0;.    for(pPg=
8260: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
8270: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
8280: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
8290: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
82a0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
82b0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
82c0: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
82d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
82e0: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
82f0: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
8300: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
8310: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
8320: 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  }.    pPager->di
8330: 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20  rtyCache = 0;.  
8340: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
8350: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
8360: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
8370: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
8380: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
8390: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
83a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75  ==0 || pPager->u
83b0: 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  seJournal==0 );.
83c0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
83d0: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65  e3OsUnlock(pPage
83e0: 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
83f0: 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  CK);.  pPager->s
8400: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
8410: 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f  RED;.  pPager->o
8420: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
8430: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
8440: 65 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  er = 0;.  return
8450: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
8460: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
8470: 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20   a checksum for 
8480: 74 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61  the page of data
8490: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
84a0: 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b  not a real check
84b0: 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c  sum.  It is real
84c0: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
84d0: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
84e0: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
84f0: 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  and the page num
8500: 62 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d  ber.  We experim
8510: 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  ented with.** a 
8520: 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20  checksum of the 
8530: 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74  entire data, but
8540: 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20   that was found 
8550: 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a  to be too slow..
8560: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
8570: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
8580: 69 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  is stored at the
8590: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61   beginning of da
85a0: 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68  ta and.** the ch
85b0: 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64  ecksum is stored
85c0: 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
85d0: 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e  is is important.
85e0: 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20    If journal.** 
85f0: 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72  corruption occur
8600: 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72  s due to a power
8610: 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f   failure, the mo
8620: 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72  st likely scenar
8630: 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e  io.** is that on
8640: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
8650: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
8660: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
8670: 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68  .  It is.** much
8680: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
8690: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
86a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
86b0: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
86c0: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
86d0: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
86e0: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
86f0: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
8700: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
8710: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
8720: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
8730: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
8740: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  orruption..**.**
8750: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64   FIX ME:  Consid
8760: 65 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20  er adding every 
8770: 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79  200th (or so) by
8780: 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74  te of the data t
8790: 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75  o the.** checksu
87a0: 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20  m.  That way if 
87b0: 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70  a single page sp
87c0: 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69  ans 3 or more di
87d0: 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a  sk sectors and.*
87e0: 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c  * only the middl
87f0: 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72  e sector is corr
8800: 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  upt, we will sti
8810: 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e  ll have a reason
8820: 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f  able.** chance o
8830: 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68  f failing the ch
8840: 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20  ecksum and thus 
8850: 64 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72  detecting the pr
8860: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  oblem..*/.static
8870: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
8880: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
8890: 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74  Pgno pgno, const
88a0: 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20 75   u8 *aData){.  u
88b0: 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67 65  32 cksum = pPage
88c0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20  r->cksumInit;.  
88d0: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
88e0: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20  pageSize-200;.  
88f0: 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20  while( i>0 ){.  
8900: 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61    cksum += aData
8910: 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30  [i];.    i -= 20
8920: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
8930: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
8940: 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61  Read a single pa
8950: 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ge from the jour
8960: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20  nal file opened 
8970: 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
8980: 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79  or.** jfd.  Play
8990: 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61  back this one pa
89a0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65  ge..**.** If use
89b0: 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e  Cksum==0 it mean
89c0: 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64  s this journal d
89d0: 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63  oes not use chec
89e0: 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d  ksums.  Checksum
89f0: 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65  s.** are not use
8a00: 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a  d in statement j
8a10: 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20  ournals because 
8a20: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
8a30: 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65  ls do not.** nee
8a40: 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77  d to survive pow
8a50: 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a  er failures..*/.
8a60: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8a70: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
8a80: 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
8a90: 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69  , OsFile *jfd, i
8aa0: 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20  nt useCksum){.  
8ab0: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
8ac0: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
8ad0: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
8ae0: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
8af0: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
8b00: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
8b10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8b20: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
8b30: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
8b40: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
8b50: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
8b60: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
8b70: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
8b80: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
8b90: 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54 45   u8 aData[SQLITE
8ba0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b  _MAX_PAGE_SIZE];
8bb0: 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67    /* Temp storag
8bc0: 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a  e for a page */.
8bd0: 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73  .  /* useCksum s
8be0: 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66 6f  hould be true fo
8bf0: 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  r the main journ
8c00: 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f 72  al and false for
8c10: 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
8c20: 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69 66  journals.  Verif
8c30: 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20 61  y that this is a
8c40: 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a 20  lways the case. 
8c50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a 66   */.  assert( jf
8c60: 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f  d == (useCksum ?
8c70: 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70   pPager->jfd : p
8c80: 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a  Pager->stfd) );.
8c90: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
8ca0: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
8cb0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8cc0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
8cd0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8ce0: 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61  OsRead(jfd, &aDa
8cf0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
8d00: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
8d10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8d20: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
8d30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
8d40: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8d50: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
8d60: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
8d70: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
8d80: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
8d90: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
8da0: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
8db0: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
8dc0: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
8dd0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
8de0: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
8df0: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
8e00: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
8e10: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
8e20: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
8e30: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
8e40: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
8e50: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
8e60: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
8e70: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
8e80: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
8e90: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
8ea0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
8eb0: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
8ec0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
8ed0: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
8ee0: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
8ef0: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
8f00: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8f10: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
8f20: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
8f30: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
8f40: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
8f50: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
8f60: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
8f70: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
8f80: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
8f90: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61  (pPager, pgno, a
8fa0: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
8fb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8fc0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
8fd0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
8fe0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
8ff0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
9000: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
9010: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
9020: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
9030: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
9040: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
9050: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
9060: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
9070: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
9080: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
9090: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
90a0: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
90b0: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
90c0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
90d0: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
90e0: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
90f0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
9100: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
9110: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
9120: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
9130: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
9140: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
9150: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
9160: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
9170: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
9180: 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  rty..  **.  ** T
9190: 69 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68  icket #1171:  Th
91a0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
91b0: 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69  nal might contai
91c0: 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74  n page content t
91d0: 68 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66  hat is.  ** diff
91e0: 65 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70  erent from the p
91f0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74  age content at t
9200: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
9210: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
9220: 2a 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68  * This occurs wh
9230: 65 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61  en a page is cha
9240: 6e 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  nged prior to th
9250: 65 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61  e start of a sta
9260: 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e  tement.  ** then
9270: 20 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77   changed again w
9280: 69 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d  ithin the statem
9290: 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69  ent.  When rolli
92a0: 6e 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20  ng back such a. 
92b0: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65   ** statement we
92c0: 20 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20   must not write 
92d0: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
92e0: 64 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20  database unless 
92f0: 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72  we know.  ** for
9300: 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72   certain that or
9310: 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74  iginal page cont
9320: 65 6e 74 73 20 61 72 65 20 69 6e 20 74 68 65 20  ents are in the 
9330: 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20  main rollback.  
9340: 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68  ** journal.  Oth
9350: 65 72 77 69 73 65 2c 20 69 66 20 61 20 66 75 6c  erwise, if a ful
9360: 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72  l ROLLBACK occur
9370: 73 20 61 66 74 65 72 20 74 68 65 20 73 74 61 74  s after the stat
9380: 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62  ement.  ** rollb
9390: 61 63 6b 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c  ack the full ROL
93a0: 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72  LBACK will not r
93b0: 65 73 74 6f 72 65 20 74 68 65 20 70 61 67 65 20  estore the page 
93c0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
93d0: 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54    ** content.  T
93e0: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
93f0: 73 74 20 62 65 20 6d 65 74 20 62 65 66 6f 72 65  st be met before
9400: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
9410: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69  database.  ** fi
9420: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
9430: 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 6c 6f  abase must be lo
9440: 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e  cked.  (2) we kn
9450: 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67  ow that the orig
9460: 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63  inal.  ** page c
9470: 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20 74 68 65  ontent is in the
9480: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
9490: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
94a0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a   page is not in.
94b0: 20 20 2a 2a 20 63 61 63 68 65 20 6f 72 20 65 6c    ** cache or el
94c0: 73 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20  se it is marked 
94d0: 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a  as needSync==0..
94e0: 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67    */.  pPg = pag
94f0: 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
9500: 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72  , pgno);.  asser
9510: 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
9520: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
9530: 45 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20  E || pPg!=0 );. 
9540: 20 54 52 41 43 45 33 28 22 50 4c 41 59 42 41 43   TRACE3("PLAYBAC
9550: 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  K %d page %d\n",
9560: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
9570: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
9580: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
9590: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
95a0: 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d   (pPg==0 || pPg-
95b0: 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b  >needSync==0) ){
95c0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
95d0: 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e  3OsSeek(pPager->
95e0: 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
95f0: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
9600: 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  ze);.    if( rc=
9610: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9620: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9630: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9640: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
9650: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9660: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 20    }.    if( pPg 
9670: 29 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30  ) pPg->dirty = 0
9680: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
9690: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
96a0: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
96b0: 20 65 78 70 6c 69 63 69 74 6c 79 20 72 6f 6c 6c   explicitly roll
96c0: 65 64 20 62 61 63 6b 20 74 68 61 74 20 69 73 20  ed back that is 
96d0: 69 6e 20 75 73 65 2c 20 65 78 63 65 70 74 0a 20  in use, except. 
96e0: 20 20 20 2a 2a 20 66 6f 72 20 70 61 67 65 20 31     ** for page 1
96f0: 20 77 68 69 63 68 20 69 73 20 68 65 6c 64 20 69   which is held i
9700: 6e 20 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74  n use in order t
9710: 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f 63 6b 20  o keep the lock 
9720: 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  on the.    ** da
9730: 74 61 62 61 73 65 20 61 63 74 69 76 65 2e 20 48  tabase active. H
9740: 6f 77 65 76 65 72 20 73 75 63 68 20 61 20 70 61  owever such a pa
9750: 67 65 20 6d 61 79 20 62 65 20 72 6f 6c 6c 65 64  ge may be rolled
9760: 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
9770: 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61 6e 20 69  t.    ** of an i
9780: 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 20 72 65  nternal error re
9790: 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 75  sulting in an au
97a0: 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20 74 6f 0a  tomatic call to.
97b0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 70 61      ** sqlite3pa
97c0: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a  ger_rollback()..
97d0: 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20      */.    void 
97e0: 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f 2a 20 61  *pData;.    /* a
97f0: 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
9800: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f  ==0 || pPg->pgno
9810: 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20 20 70 44  ==1 ); */.    pD
9820: 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  ata = PGHDR_TO_D
9830: 41 54 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65  ATA(pPg);.    me
9840: 6d 63 70 79 28 70 44 61 74 61 2c 20 61 44 61 74  mcpy(pData, aDat
9850: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
9860: 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50  ize);.    if( pP
9870: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
9880: 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d  r ){  /*** FIX M
9890: 45 3a 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20  E:  Should this 
98a0: 62 65 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f  be xReinit? ***/
98b0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
98c0: 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
98d0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
98e0: 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  ze);.    }.#ifde
98f0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
9900: 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61  AGES.    pPg->pa
9910: 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70  geHash = pager_p
9920: 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65  agehash(pPg);.#e
9930: 6e 64 69 66 0a 20 20 20 20 43 4f 44 45 43 28 70  ndif.    CODEC(p
9940: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
9950: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d  g->pgno, 3);.  }
9960: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9970: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
9980: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
9990: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
99a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
99b0: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
99c0: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
99d0: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
99e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
99f0: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
9a00: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
9a10: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
9a20: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
9a30: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
9a40: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9a50: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
9a60: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
9a70: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
9a80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  r journal file c
9a90: 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d 65  ontains the name
9aa0: 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20 6a  s of all child j
9ab0: 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20 74  ournals..** To t
9ac0: 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72 20  ell if a master 
9ad0: 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 64  journal can be d
9ae0: 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74 6f  eleted, check to
9af0: 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a 20   each of the.** 
9b00: 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61 6c  children.  If al
9b10: 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20 65  l children are e
9b20: 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f 72  ither missing or
9b30: 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74 6f   do not refer to
9b40: 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74 20  .** a different 
9b50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c 20  master journal, 
9b60: 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65 72  then this master
9b70: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
9b80: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
9b90: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
9ba0: 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68 61  master(const cha
9bb0: 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
9bc0: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73  nt rc;.  int mas
9bd0: 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  ter_open = 0;.  
9be0: 4f 73 46 69 6c 65 20 2a 6d 61 73 74 65 72 20 3d  OsFile *master =
9bf0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   0;.  char *zMas
9c00: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
9c10: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
9c20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9c30: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
9c40: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
9c50: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
9c60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9c70: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
9c80: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9c90: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
9ca0: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
9cb0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
9cc0: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
9cd0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
9ce0: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
9cf0: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
9d00: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 72  erence..  */.  r
9d10: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
9d20: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73 74 65  nReadOnly(zMaste
9d30: 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20 20 69  r, &master);.  i
9d40: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9d50: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
9d60: 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f  r_out;.  master_
9d70: 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d  open = 1;.  rc =
9d80: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
9d90: 7a 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73  ze(master, &nMas
9da0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
9db0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9dc0: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
9dd0: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
9de0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
9df0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
9e00: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
9e10: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
9e20: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
9e30: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
9e40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
9e50: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
9e60: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
9e70: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70  teMalloc() and p
9e80: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61  ointed to by zMa
9e90: 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20  sterJournal. .  
9ea0: 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72    */.    zMaster
9eb0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20  Journal = (char 
9ec0: 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e  *)sqliteMalloc(n
9ed0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
9ee0: 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72      if( !zMaster
9ef0: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
9f00: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
9f10: 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64  EM;.      goto d
9f20: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9f30: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
9f40: 69 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65  ite3OsRead(maste
9f50: 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  r, zMasterJourna
9f60: 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l, nMasterJourna
9f70: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  l);.    if( rc!=
9f80: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9f90: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9fa0: 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20  .    zJournal = 
9fb0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a  zMasterJournal;.
9fc0: 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75      while( (zJou
9fd0: 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72  rnal-zMasterJour
9fe0: 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72  nal)<nMasterJour
9ff0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28  nal ){.      if(
a000: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78   sqlite3OsFileEx
a010: 69 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29  ists(zJournal) )
a020: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
a030: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
a040: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
a050: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a060: 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
a070: 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
a080: 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
a090: 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
a0a0: 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
a0b0: 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
a0c0: 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
a0d0: 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
a0e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
a0f0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
a100: 20 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c   OsFile *journal
a110: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
a120: 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63  t c;..        rc
a130: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
a140: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
a150: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
a160: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
a170: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
a180: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
a190: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
a1a0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
a1b0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
a1c0: 61 6c 28 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61  al(journal, &zMa
a1d0: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
a1e0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a1f0: 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  (&journal);.    
a200: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
a210: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
a220: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
a230: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
a240: 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d  ..        c = zM
a250: 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20 73  asterPtr!=0 && s
a260: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
a270: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
a280: 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
a290: 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  e(zMasterPtr);. 
a2a0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
a2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
a2c0: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
a2d0: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
a2e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a2f0: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
a300: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
a310: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
a320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
a330: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
a340: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
a350: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73      }.  }.  .  s
a360: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
a370: 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73  Master);..delmas
a380: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
a390: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
a3a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
a3b0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
a3c0: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
a3d0: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
a3e0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
a3f0: 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72  master);.  }.  r
a400: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
a410: 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61  ** Make every pa
a420: 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  ge in the cache 
a430: 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74 20  agree with what 
a440: 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20  is on disk.  In 
a450: 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20  other words,.** 
a460: 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b 20  reread the disk 
a470: 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74 61  to reset the sta
a480: 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e  te of the cache.
a490: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
a4a0: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
a4b0: 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69  ter a rollback i
a4c0: 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20  n which some of 
a4d0: 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65 0a  the dirty cache.
a4e0: 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65 76  ** pages had nev
a4f0: 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  er been written 
a500: 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65  out to disk.  We
a510: 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61   need to roll ba
a520: 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20  ck the.** cache 
a530: 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20  content and the 
a540: 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 64  easiest way to d
a550: 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65 72  o that is to rer
a560: 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74  ead the old cont
a570: 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d  ent.** back from
a580: 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74   the disk..*/.st
a590: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72  atic int pager_r
a5a0: 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65  eload_cache(Page
a5b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
a5c0: 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
a5d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a5e0: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
a5f0: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
a600: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
a610: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b 53  .    char zBuf[S
a620: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a630: 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21 70  IZE];.    if( !p
a640: 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74  Pg->dirty ) cont
a650: 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69  inue;.    if( (i
a660: 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
a670: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
a680: 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ze ){.      rc =
a690: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
a6a0: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
a6b0: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
a6c0: 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b  )(pPg->pgno-1));
a6d0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
a6e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a6f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a700: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
a710: 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
a720: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
a730: 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 33    }.      TRACE3
a740: 28 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67  ("REFETCH %d pag
a750: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
a760: 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
a770: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
a780: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
a790: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
a7a0: 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  zBuf, pPg->pgno,
a7b0: 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   2);.    }else{.
a7c0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
a7d0: 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  f, 0, pPager->pa
a7e0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
a7f0: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
a800: 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42  ==0 || memcmp(zB
a810: 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  uf, PGHDR_TO_DAT
a820: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
a830: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
a840: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
a850: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
a860: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
a870: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
a880: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a890: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
a8a0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
a8b0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
a8c0: 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
a8d0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
a8e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
a8f0: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
a900: 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  A(pPg, pPager), 
a910: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
a920: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
a930: 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  }.    pPg->needS
a940: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ync = 0;.    pPg
a950: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  ->dirty = 0;.#if
a960: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
a970: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
a980: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
a990: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
a9a0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
a9b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a9c0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
a9d0: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
a9e0: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
a9f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
aa00: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a  s.** indicated..
aa10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
aa20: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
aa30: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
aa40: 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
aa50: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
aa60: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
aa70: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
aa80: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
aa90: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
aaa0: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
aab0: 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  )nPage);.}../*.*
aac0: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
aad0: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
aae0: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
aaf0: 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
ab00: 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
ab10: 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
ab20: 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
ab30: 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
ab40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
ab50: 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
ab60: 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
ab70: 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
ab80: 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
ab90: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
aba0: 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
abb0: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
abc0: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
abd0: 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
abe0: 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
abf0: 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
ac00: 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
ac10: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
ac20: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
ac30: 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
ac40: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
ac50: 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
ac60: 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
ac70: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
ac80: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
ac90: 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
aca0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
acb0: 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
acc0: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
acd0: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
ace0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
acf0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
ad00: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
ad10: 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
ad20: 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
ad30: 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
ad40: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
ad50: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
ad60: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
ad70: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ad80: 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
ad90: 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
ada0: 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
adb0: 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
adc0: 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
add0: 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
ade0: 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (6)  N bytes of
adf0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
ae00: 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
ae10: 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
ae20: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
ae30: 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
ae40: 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
ae50: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
ae60: 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
ae70: 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
ae80: 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
ae90: 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
aea0: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
aeb0: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
aec0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
aed0: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
aee0: 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
aef0: 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (7)  Zero or m
af00: 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
af10: 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
af20: 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
af30: 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
af40: 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
af50: 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
af60: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
af70: 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
af80: 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
af90: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
afa0: 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
afb0: 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
afc0: 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20  ean the first 6 
afd0: 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
afe0: 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
aff0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
b000: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
b010: 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  7th item..**.** 
b020: 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
b030: 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
b040: 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
b050: 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
b060: 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
b070: 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
b080: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
b090: 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
b0a0: 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
b0b0: 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
b0c0: 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
b0d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b0e0: 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
b0f0: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
b100: 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
b110: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
b120: 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
b130: 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
b140: 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
b150: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
b160: 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
b170: 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
b180: 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
b190: 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
b1a0: 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
b1b0: 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
b1c0: 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
b1d0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
b1e0: 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
b1f0: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
b200: 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
b210: 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
b220: 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
b230: 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
b240: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
b250: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
b260: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
b270: 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
b280: 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
b290: 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
b2a0: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
b2b0: 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
b2c0: 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
b2d0: 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
b2e0: 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
b2f0: 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
b300: 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
b310: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
b320: 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
b330: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
b340: 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
b350: 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
b360: 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
b370: 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
b380: 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
b390: 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
b3a0: 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
b3b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
b3c0: 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
b3d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
b3e0: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
b3f0: 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
b400: 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
b410: 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
b420: 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
b430: 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
b440: 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
b450: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
b460: 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
b470: 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
b480: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
b490: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
b4a0: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
b4b0: 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
b4c0: 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
b4d0: 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
b4e0: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
b4f0: 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
b500: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
b510: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
b520: 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
b530: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
b540: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
b550: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b560: 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
b570: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
b580: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
b590: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b5a0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
b5b0: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
b5c0: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
b5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b5e0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
b5f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
b600: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
b610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b620: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
b630: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
b640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
b650: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
b660: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
b670: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
b680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b690: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
b6a0: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
b6b0: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
b6c0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
b6d0: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
b6e0: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
b6f0: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
b700: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
b710: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
b720: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
b730: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
b740: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
b750: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
b760: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
b770: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
b780: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
b790: 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
b7a0: 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
b7b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
b7c0: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
b7d0: 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  back;.  }..  /* 
b7e0: 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20  Read the master 
b7f0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f  journal name fro
b800: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  m the journal, i
b810: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e  f it is present.
b820: 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65  .  ** If a maste
b830: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
b840: 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
b850: 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69  , but the file i
b860: 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65  s not.  ** prese
b870: 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e  nt on disk, then
b880: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
b890: 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73  not hot and does
b8a0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a   not need to be.
b8b0: 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b    ** played back
b8c0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
b8d0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
b8e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d  pPager->jfd, &zM
b8f0: 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74  aster);.  assert
b900: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
b910: 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  E );.  if( rc!=S
b920: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61  QLITE_OK || (zMa
b930: 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33  ster && !sqlite3
b940: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61  OsFileExists(zMa
b950: 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71  ster)) ){.    sq
b960: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
b970: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
b980: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   0;.    if( rc==
b990: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63  SQLITE_DONE ) rc
b9a0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b9b0: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b9c0: 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ack;.  }.  sqlit
b9d0: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
b9e0: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67  >jfd, 0);.  pPag
b9f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
ba00: 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
ba10: 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
ba20: 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
ba30: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
ba40: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
ba50: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
ba60: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
ba70: 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
ba80: 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
ba90: 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
baa0: 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
bab0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bac0: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
bad0: 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
bae0: 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
baf0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bb00: 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
bb10: 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
bb20: 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
bb30: 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
bb40: 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
bb50: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
bb60: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
bb70: 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
bb80: 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
bb90: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
bba0: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
bbb0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
bbc0: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
bbd0: 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
bbe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bbf0: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
bc00: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
bc10: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
bc20: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
bc30: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
bc40: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
bc50: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
bc60: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
bc70: 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
bc80: 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
bc90: 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
bca0: 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
bcb0: 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
bcc0: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
bcd0: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
bce0: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
bcf0: 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
bd00: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
bd10: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
bd20: 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
bd30: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
bd40: 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
bd50: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
bd60: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
bd70: 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
bd80: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
bd90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bda0: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
bdb0: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
bdc0: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
bdd0: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
bde0: 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
bdf0: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
be00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
be10: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
be20: 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
be30: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
be40: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
be50: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
be60: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
be70: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
be80: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
be90: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
bea0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
beb0: 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
bec0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
bed0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bee0: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
bef0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
bf00: 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70  igDbSize==0 || p
bf10: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
bf20: 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20  e==mxPg );.     
bf30: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
bf40: 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
bf50: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
bf60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bf70: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
bf80: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
bf90: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
bfa0: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
bfb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20     }..    /* rc 
bfc0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
bfd0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55  pPager->jfd, JOU
bfe0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
bff0: 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28  er)); */.    if(
c000: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c010: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
c020: 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f  ck;.  .    /* Co
c030: 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
c040: 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75  s out of the jou
c050: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
c060: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
c070: 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
c080: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63   for(i=0; i<nRec
c090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63  ; i++){.      rc
c0a0: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
c0b0: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
c0c0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  r, pPager->jfd, 
c0d0: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
c0e0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c0f0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c100: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
c110: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
c120: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
c130: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
c140: 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20  lOff = szJ;.    
c150: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c160: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c170: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
c180: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20  layback;.       
c190: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
c1a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73  .  }..  /* Pages
c1b0: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
c1c0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
c1d0: 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72  ournal but never
c1e0: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65   synced.  ** whe
c1f0: 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20  re not restored 
c200: 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76  by the loop abov
c210: 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72  e.  We have to r
c220: 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a  estore those.  *
c230: 2a 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69  * pages by readi
c240: 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f  ng them back fro
c250: 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  m the original d
c260: 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  atabase..  */.  
c270: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
c280: 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72  TE_OK );.  pager
c290: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50  _reload_cache(pP
c2a0: 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79  ager);..end_play
c2b0: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d  back:.  if( rc==
c2c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c2d0: 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
c2e0: 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
c2f0: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74  .  }.  if( zMast
c300: 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  er ){.    /* If 
c310: 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
c320: 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
c330: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
c340: 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20   return true,.  
c350: 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
c360: 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
c370: 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
c380: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
c390: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
c3a0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
c3b0: 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73  c = pager_delmas
c3c0: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
c3d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
c3e0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
c3f0: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
c400: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
c410: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
c420: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
c430: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
c440: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
c450: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
c460: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
c470: 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  nt PAGER_SECTOR_
c480: 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  SIZE.  ** value.
c490: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
c4a0: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
c4b0: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
c4c0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
c4d0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47  sectorSize = PAG
c4e0: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  ER_SECTOR_SIZE;.
c4f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
c500: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
c510: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c520: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
c530: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
c540: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
c550: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
c560: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
c570: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
c580: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
c590: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
c5a0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
c5b0: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
c5c0: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
c5d0: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
c5e0: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
c5f0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
c600: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
c610: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
c620: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
c630: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
c640: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
c650: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
c660: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
c670: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
c680: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
c690: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
c6a0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
c6b0: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
c6c0: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
c6d0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
c6e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c6f0: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
c700: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
c710: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
c720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
c730: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
c740: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
c750: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
c760: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
c770: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c780: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
c790: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
c7a0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c7b0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
c7c0: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
c7d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
c7e0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
c7f0: 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
c800: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
c810: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
c820: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
c830: 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
c840: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
c850: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
c860: 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
c870: 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
c880: 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
c890: 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
c8a0: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a  t to the first j
c8b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
c8c0: 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  itten.  ** this 
c8d0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
c8e0: 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e  ction, or the en
c8f0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
c900: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
c910: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
c920: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
c930: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
c940: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
c950: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
c960: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
c970: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
c980: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
c990: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
c9a0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
c9b0: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
c9c0: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
c9d0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
c9e0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
c9f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
ca00: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
ca10: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
ca20: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
ca30: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
ca40: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
ca50: 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a  >stmtSize;..  /*
ca60: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
ca70: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
ca80: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
ca90: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
caa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
cab0: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
cac0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
cad0: 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  en );.  sqlite3O
cae0: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
caf0: 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d  fd, 0);.  nRec =
cb00: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
cb10: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
cb20: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
cb30: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
cb40: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
cb50: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
cb60: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
cb70: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
cb80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
cb90: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
cba0: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
cbb0: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
cbc0: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
cbd0: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
cbe0: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
cbf0: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
cc00: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
cc10: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
cc20: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
cc30: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
cc40: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
cc50: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
cc60: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
cc70: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
cc80: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
cc90: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
cca0: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
ccb0: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
ccc0: 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
ccd0: 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
cce0: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
ccf0: 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
cd00: 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
cd10: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
cd20: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
cd30: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
cd40: 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
cd50: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
cd60: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
cd70: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
cd80: 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
cd90: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
cda0: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
cdb0: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
cdc0: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
cdd0: 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
cde0: 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
cdf0: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
ce00: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
ce10: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
ce20: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
ce30: 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
ce40: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
ce50: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
ce60: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
ce70: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
ce80: 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
ce90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cea0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
ceb0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
cec0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
ced0: 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
cee0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
cef0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
cf00: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
cf10: 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  ksum;.  assert( 
cf20: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
cf30: 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e  Pager)<(pPager->
cf40: 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20  pageSize+8) );. 
cf50: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
cf60: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68  journalOff <= (h
cf70: 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70  drOff-(pPager->p
cf80: 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20  ageSize+8)) ){. 
cf90: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
cfa0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
cfb0: 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
cfc0: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  jfd, 1);.    ass
cfd0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
cfe0: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
cff0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
d000: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
d010: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
d020: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
d030: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
d040: 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b 0a  {.    u32 nRec;.
d050: 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
d060: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
d070: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
d080: 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d  zJ, &nRec, &dumm
d090: 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  y);.    if( rc!=
d0a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d0b0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
d0c0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
d0d0: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d      goto end_stm
d0e0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
d0f0: 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d  }.    if( nRec==
d100: 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20  0 ){.      nRec 
d110: 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d  = (szJ - pPager-
d120: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28  >journalOff) / (
d130: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d140: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  +8);.    }.    f
d150: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
d160: 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0 && pPager->jou
d170: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69  rnalOff < szJ; i
d180: 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  --){.      rc = 
d190: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d1a0: 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20  ne_page(pPager, 
d1b0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
d1c0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
d1d0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
d1e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
d1f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
d200: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
d210: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
d220: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
d230: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
d240: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
d250: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
d260: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
d270: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
d280: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
d290: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
d2a0: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c  E_CORRUPT;.  }el
d2b0: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
d2c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
d2d0: 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72  ;.    /* pager_r
d2e0: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
d2f0: 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  er); */.  }.  re
d300: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
d310: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
d320: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
d330: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
d340: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
d350: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d360: 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73  pager_set_caches
d370: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
d380: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
d390: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
d3a0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
d3b0: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
d3c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
d3d0: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
d3e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
d3f0: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
d400: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
d410: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
d420: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
d430: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
d440: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
d450: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
d460: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
d470: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
d480: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
d490: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
d4a0: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
d4b0: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
d4c0: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
d4d0: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
d4e0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
d4f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d500: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
d510: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
d520: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
d530: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
d540: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
d550: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d560: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d570: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d580: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
d590: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
d5a0: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
d5b0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
d5c0: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
d5d0: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
d5e0: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
d5f0: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
d600: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
d610: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
d620: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
d630: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
d640: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
d650: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
d660: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
d670: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
d680: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
d690: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
d6a0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
d6b0: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
d6c0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
d6d0: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
d6e0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
d6f0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d700: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
d710: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
d720: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
d730: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
d740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d750: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d760: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
d770: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
d780: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
d790: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
d7a0: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
d7b0: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
d7c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
d7d0: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
d7e0: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
d7f0: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
d800: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
d810: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
d820: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
d830: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
d840: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
d860: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
d870: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
d880: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
d890: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
d8a0: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
d8b0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
d8c0: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
d8d0: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
d8e0: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
d8f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d900: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
d910: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  S.void sqlite3pa
d920: 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c  ger_set_safety_l
d930: 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
d940: 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a  er, int level){.
d950: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
d960: 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
d970: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
d980: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
d990: 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
d9a0: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
d9b0: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
d9c0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
d9d0: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
d9e0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
d9f0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
da00: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
da10: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
da20: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
da30: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
da40: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
da50: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
da60: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
da70: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
da80: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
da90: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20   only.  .*/.int 
daa0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
dab0: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  _count = 0;../*.
dac0: 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
dad0: 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ary file.  Write
dae0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
daf0: 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65   file into zFile
db00: 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20  .** (zFile must 
db10: 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49  be at least SQLI
db20: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
db30: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57   bytes long.)  W
db40: 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  rite.** the file
db50: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
db60: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
db70: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
db80: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
db90: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
dba0: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
dbb0: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
dbc0: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
dbd0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
dbe0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
dbf0: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
dc00: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
dc10: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
dc20: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
dc30: 6c 65 20 2a 2a 70 46 64 29 7b 0a 20 20 69 6e 74  le **pFd){.  int
dc40: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
dc50: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  rc;.  sqlite3_op
dc60: 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
dc70: 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
dc80: 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
dc90: 73 20 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a  s only */.  do{.
dca0: 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73      cnt--;.    s
dcb0: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
dcc0: 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20  Name(zFile);.   
dcd0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
dce0: 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69  penExclusive(zFi
dcf0: 6c 65 2c 20 70 46 64 2c 20 31 29 3b 0a 20 20 7d  le, pFd, 1);.  }
dd00: 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20  while( cnt>0 && 
dd10: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
dd20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
dd30: 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  M );.  return rc
dd40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
dd50: 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
dd60: 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
dd70: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
dd80: 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
dd90: 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
dda0: 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
ddb0: 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
ddc0: 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
ddd0: 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
dde0: 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
ddf0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
de00: 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
de10: 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
de20: 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
de30: 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
de40: 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75  g sqlite3pager_u
de50: 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  nref()..**.** If
de60: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
de70: 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d  LL then a random
de80: 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61  ly-named tempora
de90: 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74  ry file is creat
dea0: 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61  ed.** and used a
deb0: 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  s the file to be
dec0: 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69   cached.  The fi
ded0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
dee0: 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  ed.** automatica
def0: 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63  lly when it is c
df00: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  losed..**.** If 
df10: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
df20: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c  emory:" then all
df30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
df40: 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a  held in cache..*
df50: 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72  * It is never wr
df60: 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20  itten to disk.  
df70: 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64  This can be used
df80: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e   to implement an
df90: 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  .** in-memory da
dfa0: 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
dfb0: 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e  qlite3pager_open
dfc0: 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61  (.  Pager **ppPa
dfd0: 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ger,         /* 
dfe0: 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65 72  Return the Pager
dff0: 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20   structure here 
e000: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
e010: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a  *zFilename,   /*
e020: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
e030: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
e040: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74  en */.  int nExt
e050: 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ra,             
e060: 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73 20   /* Extra bytes 
e070: 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69  append to each i
e080: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
e090: 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20  .  int flags    
e0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66              /* f
e0b0: 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67  lags controlling
e0c0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b   this file */.){
e0d0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e0e0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 46   = 0;.  char *zF
e0f0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b  ullPathname = 0;
e100: 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a  .  int nameLen;.
e110: 20 20 4f 73 46 69 6c 65 20 2a 66 64 3b 0a 20 20    OsFile *fd;.  
e120: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e130: 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  OK;.  int i;.  i
e140: 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
e150: 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30  .  int memDb = 0
e160: 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79  ;.  int readOnly
e170: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a   = 0;.  int useJ
e180: 6f 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20  ournal = (flags 
e190: 26 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55  & PAGER_OMIT_JOU
e1a0: 52 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20  RNAL)==0;.  int 
e1b0: 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c  noReadlock = (fl
e1c0: 61 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52  ags & PAGER_NO_R
e1d0: 45 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63  EADLOCK)!=0;.  c
e1e0: 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
e1f0: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
e200: 0a 20 20 53 71 6c 69 74 65 54 73 64 20 2a 70 54  .  SqliteTsd *pT
e210: 73 64 20 3d 20 73 71 6c 69 74 65 33 54 73 64 28  sd = sqlite3Tsd(
e220: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 6d 61 6c 6c  );..  /* If mall
e230: 6f 63 28 29 20 68 61 73 20 61 6c 72 65 61 64 79  oc() has already
e240: 20 66 61 69 6c 65 64 20 72 65 74 75 72 6e 20 53   failed return S
e250: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20 42 65 66  QLITE_NOMEM. Bef
e260: 6f 72 65 20 65 76 65 6e 0a 20 20 2a 2a 20 74 65  ore even.  ** te
e270: 73 74 69 6e 67 20 66 6f 72 20 74 68 69 73 2c 20  sting for this, 
e280: 73 65 74 20 2a 70 70 50 61 67 65 72 20 74 6f 20  set *ppPager to 
e290: 4e 55 4c 4c 20 73 6f 20 74 68 65 20 63 61 6c 6c  NULL so the call
e2a0: 65 72 20 6b 6e 6f 77 73 20 74 68 65 20 70 61 67  er knows the pag
e2b0: 65 72 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  er.  ** structur
e2c0: 65 20 77 61 73 20 6e 65 76 65 72 20 61 6c 6c 6f  e was never allo
e2d0: 63 61 74 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 2a  cated. .  */.  *
e2e0: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  ppPager = 0;.  i
e2f0: 66 28 20 73 71 6c 69 74 65 33 54 73 64 28 29 2d  f( sqlite3Tsd()-
e300: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
e310: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
e320: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
e330: 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73  memset(&fd, 0, s
e340: 69 7a 65 6f 66 28 66 64 29 29 3b 0a 0a 20 20 2f  izeof(fd));..  /
e350: 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
e360: 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a 46   file and set zF
e370: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20 70  ullPathname to p
e380: 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28 29  oint at malloc()
e390: 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  ed .  ** memory 
e3a0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
e3b0: 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d 65  omplete filename
e3c0: 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e 67   (i.e. including
e3d0: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 29 2e   the directory).
e3e0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c  .  */.  if( zFil
e3f0: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
e400: 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
e410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
e420: 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
e430: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
e440: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
e450: 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
e460: 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  ;.      zFullPat
e470: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  hname = sqliteSt
e480: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d 65  rDup("");.    }e
e490: 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
e4a0: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
e4b0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  name = sqlite3Os
e4c0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69  FullPathname(zFi
e4d0: 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69  lename);.      i
e4e0: 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  f( zFullPathname
e4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
e500: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
e510: 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61 74  adWrite(zFullPat
e520: 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65 61  hname, &fd, &rea
e530: 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 7d 0a  dOnly);.      }.
e540: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
e550: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
e560: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
e570: 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20 20 7a  emp, &fd);.    z
e580: 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65 6d 70  Filename = zTemp
e590: 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e  ;.    zFullPathn
e5a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  ame = sqlite3OsF
e5b0: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46 69 6c  ullPathname(zFil
e5c0: 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20  ename);.    if( 
e5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
e5e0: 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c 65 20  .      tempFile 
e5f0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 1;.    }.  }..
e600: 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68    /* Allocate th
e610: 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72  e Pager structur
e620: 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  e. As part of th
e630: 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74 69 6f  e same allocatio
e640: 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  n, allocate.  **
e650: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 66   space for the f
e660: 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74 68 65  ull paths of the
e670: 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f 72 79   file, directory
e680: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   and journal .  
e690: 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c 65 6e  ** (Pager.zFilen
e6a0: 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69 72 65  ame, Pager.zDire
e6b0: 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65 72 2e  ctory and Pager.
e6c0: 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a 2f 0a  zJournal)..  */.
e6d0: 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e    if( zFullPathn
e6e0: 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d 65 4c  ame ){.    nameL
e6f0: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c  en = strlen(zFul
e700: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
e710: 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 4d  pPager = sqliteM
e720: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
e730: 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e  Pager) + nameLen
e740: 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 7d 0a 0a  *3 + 30 );.  }..
e750: 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
e760: 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
e770: 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
e780: 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
e790: 20 6d 65 6d 6f 72 79 20 0a 20 20 2a 2a 20 70 6f   memory .  ** po
e7a0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 46 75 6c  inted to by zFul
e7b0: 6c 50 61 74 68 6e 61 6d 65 2c 20 66 72 65 65 20  lPathname, free 
e7c0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
e7d0: 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74 68  ure and close th
e7e0: 65 20 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 53 69  e .  ** file. Si
e7f0: 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69 73  nce the pager is
e800: 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20 74   not allocated t
e810: 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20  here is no need 
e820: 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e 79  to set .  ** any
e830: 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20 76   Pager.errMask v
e840: 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20  ariables..  */. 
e850: 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c 20   if( !pPager || 
e860: 21 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 7c  !zFullPathname |
e870: 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc!=SQLITE_OK 
e880: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
e890: 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20  Close(&fd);.    
e8a0: 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c  sqliteFree(zFull
e8b0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73  Pathname);.    s
e8c0: 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
e8d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28  );.    return ((
e8e0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53  rc==SQLITE_OK)?S
e8f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b  QLITE_NOMEM:rc);
e900: 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 33 28 22  .  }..  TRACE3("
e910: 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46  OPEN %d %s\n", F
e920: 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64 29 2c  ILEHANDLEID(fd),
e930: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
e940: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
e950: 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
e960: 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
e970: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d  er->zDirectory =
e980: 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e   &pPager->zFilen
e990: 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a  ame[nameLen+1];.
e9a0: 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
e9b0: 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44  al = &pPager->zD
e9c0: 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65 4c 65 6e  irectory[nameLen
e9d0: 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79 28 70 50  +1];.  strcpy(pP
e9e0: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
e9f0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
ea00: 0a 20 20 73 74 72 63 70 79 28 70 50 61 67 65 72  .  strcpy(pPager
ea10: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 46  ->zDirectory, zF
ea20: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 0a 20  ullPathname);.. 
ea30: 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20   for(i=nameLen; 
ea40: 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a  i>0 && pPager->z
ea50: 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d  Directory[i-1]!=
ea60: 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66  '/'; i--){}.  if
ea70: 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e  ( i>0 ) pPager->
ea80: 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20  zDirectory[i-1] 
ea90: 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28 70 50  = 0;.  strcpy(pP
eaa0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
eab0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
eac0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75    sqliteFree(zFu
ead0: 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73  llPathname);.  s
eae0: 74 72 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a  trcpy(&pPager->z
eaf0: 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65 6e 5d  Journal[nameLen]
eb00: 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20  , "-journal");. 
eb10: 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 66 64   pPager->fd = fd
eb20: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
eb30: 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  nalOpen = 0;.  p
eb40: 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
eb50: 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26  l = useJournal &
eb60: 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67  & !memDb;.  pPag
eb70: 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
eb80: 20 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72   noReadlock && r
eb90: 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65  eadOnly;.  pPage
eba0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
ebb0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
ebc0: 6e 55 73 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  nUse = 0;.  pPag
ebd0: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
ebe0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
ebf0: 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
ec00: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  er->pageSize = S
ec10: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
ec20: 47 45 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65  GE_SIZE;.  pPage
ec30: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b  r->stmtSize = 0;
ec40: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  .  pPager->stmtJ
ec50: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
ec60: 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20  er->nPage = 0;. 
ec70: 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67   pPager->nMaxPag
ec80: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
ec90: 3e 6d 78 50 61 67 65 20 3d 20 31 30 30 3b 0a 20  >mxPage = 100;. 
eca0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
ecb0: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
ecc0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
ecd0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
ece0: 74 65 6d 70 46 69 6c 65 20 3d 20 74 65 6d 70 46  tempFile = tempF
ecf0: 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d  ile;.  pPager->m
ed00: 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
ed10: 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
ed20: 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 70   = readOnly;.  p
ed30: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
ed40: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
ed50: 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
ed60: 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
ed70: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
ed80: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
ed90: 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
eda0: 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46  1);.  pPager->pF
edb0: 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  irst = 0;.  pPag
edc0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
edd0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
ede0: 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  pLast = 0;.  pPa
edf0: 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f  ger->nExtra = FO
ee00: 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45  RCE_ALIGNMENT(nE
ee10: 78 74 72 61 29 3b 0a 20 20 70 50 61 67 65 72 2d  xtra);.  pPager-
ee20: 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41  >sectorSize = PA
ee30: 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  GER_SECTOR_SIZE;
ee40: 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
ee50: 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a 20 20 6d  Handler = 0;.  m
ee60: 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
ee70: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
ee80: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a  Pager->aHash));.
ee90: 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
eea0: 67 65 72 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  ger;.  pPager->p
eeb0: 4e 65 78 74 20 3d 20 70 54 73 64 2d 3e 70 50 61  Next = pTsd->pPa
eec0: 67 65 72 3b 0a 20 20 70 54 73 64 2d 3e 70 50 61  ger;.  pTsd->pPa
eed0: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
eee0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
eef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
ef00: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
ef10: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
ef20: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
ef30: 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50  et_busyhandler(P
ef40: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
ef50: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
ef60: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
ef70: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
ef80: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
ef90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
efa0: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
efb0: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
efc0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
efd0: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
efe0: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
eff0: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
f000: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
f010: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
f020: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
f030: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
f040: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
f050: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
f060: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
f070: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
f080: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
f090: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
f0a0: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
f0b0: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
f0c0: 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
f0d0: 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
f0e0: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61  led by sqlite3pa
f0f0: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a  ger_unref()..*/.
f100: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
f110: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
f120: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
f130: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
f140: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
f150: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
f160: 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
f170: 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
f180: 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
f190: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
f1a0: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
f1b0: 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
f1c0: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
f1d0: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
f1e0: 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
f1f0: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
f200: 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
f210: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
f220: 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
f230: 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
f240: 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
f250: 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
f260: 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
f270: 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
f280: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
f290: 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
f2a0: 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
f2b0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
f2c0: 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  _reiniter(Pager 
f2d0: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
f2e0: 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69  xReinit)(void*,i
f2f0: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
f300: 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
f310: 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
f320: 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
f330: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
f340: 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73   size.  If the s
f350: 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a  uggest new page.
f360: 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70  ** size is inapp
f370: 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
f380: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
f390: 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63  ge size is selec
f3a0: 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ted.** and retur
f3b0: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
f3c0: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67  te3pager_set_pag
f3d0: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
f3e0: 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ger, int pageSiz
f3f0: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61  e){.  assert( pa
f400: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
f410: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
f420: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
f430: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
f440: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
f450: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
f460: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  pageSize;.  }.  
f470: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
f480: 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
f490: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f4a0: 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  set of routines 
f4b0: 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61  are used to disa
f4c0: 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65  ble the simulate
f4d0: 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d  d.** I/O error m
f4e0: 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65  echanism.  These
f4f0: 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73   routines are us
f500: 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75  ed to avoid simu
f510: 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20  lated.** errors 
f520: 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20  in places where 
f530: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
f540: 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a  bout errors..**.
f550: 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49  ** Unless -DSQLI
f560: 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65  TE_TEST=1 is use
f570: 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65  d, these routine
f580: 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73  s are all no-ops
f590: 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65  .** and generate
f5a0: 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66   no code..*/.#if
f5b0: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
f5c0: 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
f5d0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
f5e0: 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20  ing;.extern int 
f5f0: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
f600: 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74  _hit;.static int
f610: 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64   saved_cnt;.void
f620: 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65 64   clear_simulated
f630: 5f 69 6f 5f 65 72 72 6f 72 28 29 7b 0a 20 20 73  _io_error(){.  s
f640: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f650: 68 69 74 20 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20  hit = 0;.}.void 
f660: 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
f670: 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
f680: 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
f690: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
f6a0: 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
f6b0: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
f6c0: 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
f6d0: 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
f6e0: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
f6f0: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
f700: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
f710: 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
f720: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 63 6c  else.# define cl
f730: 65 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ear_simulated_io
f740: 5f 65 72 72 6f 72 28 29 0a 23 20 64 65 66 69 6e  _error().# defin
f750: 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
f760: 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
f770: 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
f780: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f790: 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
f7a0: 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
f7b0: 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
f7c0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
f7d0: 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
f7e0: 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
f7f0: 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
f800: 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
f810: 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
f820: 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
f830: 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
f840: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
f850: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
f860: 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
f870: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
f880: 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
f890: 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
f8a0: 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
f8b0: 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
f8c0: 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
f8d0: 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
f8e0: 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
f8f0: 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
f900: 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
f910: 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
f920: 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
f930: 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
f940: 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
f950: 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
f960: 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
f970: 20 74 68 69 73 29 2e 0a 2a 2f 0a 76 6f 69 64 20   this)..*/.void 
f980: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61  sqlite3pager_rea
f990: 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61 67  d_fileheader(Pag
f9a0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
f9b0: 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
f9c0: 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73   *pDest){.  mems
f9d0: 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b  et(pDest, 0, N);
f9e0: 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20  .  if( MEMDB==0 
f9f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
fa00: 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
fa10: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
fa20: 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66  OsRead(pPager->f
fa30: 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20  d, pDest, N);.  
fa40: 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65    clear_simulate
fa50: 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20  d_io_error();.  
fa60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
fa70: 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  n the total numb
fa80: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
fa90: 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73  he disk file ass
faa0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
fab0: 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49  pPager. .**.** I
fac0: 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59  f the PENDING_BY
fad0: 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70  TE lies on the p
fae0: 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74  age directly aft
faf0: 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  er the end of th
fb00: 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20  e.** file, then 
fb10: 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61  consider this pa
fb20: 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66  ge part of the f
fb30: 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61  ile too. For exa
fb40: 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44  mple, if.** PEND
fb50: 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65  ING_BYTE is byte
fb60: 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74   4096 (the first
fb70: 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29   byte of page 5)
fb80: 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
fb90: 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20   the.** file is 
fba0: 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73  4096 bytes, 5 is
fbb0: 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61   returned instea
fbc0: 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73  d of 4..*/.int s
fbd0: 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
fbe0: 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
fbf0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20  ger){.  i64 n;. 
fc00: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
fc10: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
fc20: 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b  er->dbSize>=0 ){
fc30: 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d  .    n = pPager-
fc40: 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73  >dbSize;.  } els
fc50: 65 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  e {.    if( sqli
fc60: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
fc70: 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53  ager->fd, &n)!=S
fc80: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
fc90: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
fca0: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44  k |= PAGER_ERR_D
fcb0: 49 53 4b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ISK;.      retur
fcc0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
fcd0: 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
fce0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
fcf0: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
fd00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
fd10: 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
fd20: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
fd30: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
fd40: 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
fd50: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
fd60: 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  dbSize = n;.    
fd70: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28  }.  }.  if( n==(
fd80: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
fd90: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
fda0: 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
fdb0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
fdc0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
fdd0: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
fde0: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
fdf0: 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a  l(Pager*);.../*.
fe00: 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  ** Unlink pPg fr
fe10: 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
fe20: 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65  in. Also set the
fe30: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
fe40: 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a  0 to indicate.**
fe50: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
fe60: 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  s not part of an
fe70: 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68  y hash chain. Th
fe80: 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  is is required b
fe90: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71  ecause the.** sq
fea0: 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
feb0: 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
fec0: 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
fed0: 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
fee0: 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
fef0: 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
ff00: 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
ff10: 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
ff20: 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
ff30: 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
ff40: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
ff50: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
ff60: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  gno==0 ){.    /*
ff70: 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
ff80: 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ber is zero, the
ff90: 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6e  n this page is n
ffa0: 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63  ot in any hash c
ffb0: 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  hain. */.    ret
ffc0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
ffd0: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
ffe0: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
fff0: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
10000 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
10010 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
10020 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
10030 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10040 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73  >aHash[pager_has
10050 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70  h(pPg->pgno)]!=p
10060 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
10070 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
10080 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
10090 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
100a0 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72     int h = pager
100b0 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
100c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
100d0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d  ager->aHash[h]==
100e0 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
100f0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
10100 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
10110 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  }..  pPg->pgno =
10120 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
10130 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
10140 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
10150 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
10160 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
10170 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
10180 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
10190 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
101a0 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
101b0 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
101c0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
101d0 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
101e0 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
101f0 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
10200 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
10210 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
10220 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
10230 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
10240 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
10250 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
10260 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
10270 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
10280 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
10290 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
102a0 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
102b0 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
102c0 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
102d0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
102e0 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
102f0 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
10300 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
10310 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
10320 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
10330 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
10340 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
10350 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
10360 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10370 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
10380 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
10390 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
103a0 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
103b0 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
103c0 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
103d0 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
103e0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
103f0 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
10400 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10410 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
10420 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
10430 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
10440 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
10450 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
10460 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
10470 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
10480 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
10490 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
104a0 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
104b0 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pPg);.}..#ifnde
104c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
104d0 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69  MORYDB./*.** Thi
104e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
104f0 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e  d to truncate an
10500 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
10510 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20  ase.  Delete.** 
10520 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
10530 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74  pgno is larger t
10540 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
10550 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
10560 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72  renced..** Refer
10570 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
10580 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
10590 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
105a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
105b0 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  d memoryTruncate
105c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
105d0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
105e0 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
105f0 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
10600 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
10610 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
10620 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
10630 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
10640 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
10650 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
10660 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
10670 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
10680 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
10690 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
106a0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
106b0 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
106c0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
106d0 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
106e0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
106f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10700 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
10710 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c  xtAll;.      unl
10720 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
10730 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
10740 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
10750 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
10760 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
10770 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e  efine memoryTrun
10780 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a  cate(p).#endif..
10790 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
107a0 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
107b0 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
107c0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
107d0 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
107e0 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
107f0 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
10800 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
10810 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
10820 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
10830 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
10840 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
10850 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10860 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
10870 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
10880 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
10890 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
108a0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
108b0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
108c0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
108d0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
108e0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
108f0 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
10900 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
10910 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
10920 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
10930 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
10940 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
10950 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
10960 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
10970 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
10980 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
10990 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
109a0 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
109b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
109c0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
109d0 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20   locktype);.    
109e0 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
109f0 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69 74  TE_BUSY && sqlit
10a00 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
10a10 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73  ler(pPager->pBus
10a20 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20 20  yHandler) );.   
10a30 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10a40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  OK ){.      pPag
10a50 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b  er->state = lock
10a60 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  type;.    }.  }.
10a70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10a80 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
10a90 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e  he file to the n
10aa0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
10ab0 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74  pecified..*/.int
10ac0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
10ad0 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
10ae0 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65  ager, Pgno nPage
10af0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
10b00 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65  qlite3pager_page
10b10 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
10b20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
10b30 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
10b40 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
10b50 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
10b60 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
10b70 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69  if( nPage>=(unsi
10b80 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53  gned)pPager->dbS
10b90 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
10ba0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
10bb0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
10bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10bd0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
10be0 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
10bf0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
10c00 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
10c10 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  }.  rc = syncJou
10c20 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
10c30 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10c40 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10c50 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65  rc;.  }..  /* Ge
10c60 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
10c70 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
10c80 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63  ase before trunc
10c90 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  ating. */.  rc =
10ca0 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
10cb0 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c  ock(pPager, EXCL
10cc0 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69  USIVE_LOCK);.  i
10cd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10ce0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10cf0 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70  c;.  }..  rc = p
10d00 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
10d10 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20  ager, nPage);.  
10d20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10d30 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
10d40 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
10d50 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10d60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64  ;.}../*.** Shutd
10d70 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63  own the page cac
10d80 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65  he.  Free all me
10d90 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61  mory and close a
10da0 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ll files..**.** 
10db0 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
10dc0 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73   was in progress
10dd0 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
10de0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
10df0 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  at.** transactio
10e00 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
10e10 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69  .  All outstandi
10e20 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
10e30 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20  alidated.** and 
10e40 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20  their memory is 
10e50 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65  freed.  Any atte
10e60 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67  mpt to use a pag
10e70 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
10e80 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63  with this page c
10e90 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20  ache after this 
10ea0 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
10eb0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20   will likely.** 
10ec0 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65  result in a core
10ed0 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dump..**.** This
10ee0 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73   function always
10ef0 20 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20   succeeds. If a 
10f00 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
10f10 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74  ctive an attempt
10f20 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72  .** is made to r
10f30 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20  oll it back. If 
10f40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
10f50 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
10f60 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f  ack .** a hot jo
10f70 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66  urnal may be lef
10f80 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73  t in the filesys
10f90 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72  tem but no error
10fa0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
10fb0 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
10fc0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
10fd0 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a  er_close(Pager *
10fe0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
10ff0 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 23   *pPg, *pNext;.#
11000 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
11010 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  IT_MEMORY_MANAGE
11020 4d 45 4e 54 0a 20 20 53 71 6c 69 74 65 54 73 64  MENT.  SqliteTsd
11030 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
11040 54 73 64 28 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Tsd();.#endif.. 
11050 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d   switch( pPager-
11060 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
11070 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  se PAGER_RESERVE
11080 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  D:.    case PAGE
11090 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63  R_SYNCED: .    c
110a0 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ase PAGER_EXCLUS
110b0 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IVE: {.      /* 
110c0 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f  We ignore any IO
110d0 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63   errors that occ
110e0 75 72 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  ur during the ro
110f0 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20  llback.      ** 
11100 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69  operation. So di
11110 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72 20 73  sable IO error s
11120 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61  imulation so tha
11130 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20 20 20  t testing.      
11140 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61  ** works more ea
11150 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  sily..      */. 
11160 20 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d       disable_sim
11170 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
11180 28 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ();.      sqlite
11190 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
111a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 65  pPager);.      e
111b0 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
111c0 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20  io_errors();.   
111d0 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
111e0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
111f0 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
11200 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
11210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
11220 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
11230 4d 61 73 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Mask || pPager->
11240 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
11250 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11260 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41     }.    case PA
11270 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20  GER_SHARED: {.  
11280 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
11290 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
112a0 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72  3OsUnlock(pPager
112b0 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
112c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
112d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
112e0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
112f0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
11300 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
11310 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50    }.  }.  for(pP
11320 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
11330 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
11340 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
11350 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
11360 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
11370 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
11380 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
11390 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
113a0 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73  rt( !pPg->always
113b0 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
113c0 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
113d0 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
113e0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
113f0 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a  >pStmt );.    }.
11400 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74  #endif.    pNext
11410 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
11420 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
11430 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41  (pPg);.  }.  TRA
11440 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
11450 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
11460 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ));.  assert( pP
11470 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c  ager->errMask ||
11480 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   (pPager->journa
11490 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67  lOpen==0 && pPag
114a0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29  er->stmtOpen==0)
114b0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
114c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
114d0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
114e0 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ose(&pPager->jfd
114f0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46  );.  }.  sqliteF
11500 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
11510 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70  ournal);.  if( p
11520 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
11530 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
11540 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
11550 74 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  tfd);.  }.  sqli
11560 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
11570 65 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65  er->fd);.  /* Te
11580 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74  mp files are aut
11590 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
115a0 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a  ed by the OS.  *
115b0 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65  * if( pPager->te
115c0 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20  mpFile ){.  **  
115d0 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
115e0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
115f0 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f  me);.  ** }.  */
11600 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
11610 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  _OMIT_MEMORY_MAN
11620 41 47 45 4d 45 4e 54 0a 20 20 2f 2a 20 52 65 6d  AGEMENT.  /* Rem
11630 6f 76 65 20 74 68 65 20 70 61 67 65 72 20 66 72  ove the pager fr
11640 6f 6d 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  om the linked li
11650 73 74 20 6f 66 20 70 61 67 65 72 73 20 73 74 61  st of pagers sta
11660 72 74 69 6e 67 20 61 74 20 0a 20 20 2a 2a 20 53  rting at .  ** S
11670 71 6c 69 74 65 54 73 64 2e 70 50 61 67 65 72 2e  qliteTsd.pPager.
11680 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
11690 65 72 3d 3d 70 54 73 64 2d 3e 70 50 61 67 65 72  er==pTsd->pPager
116a0 20 29 7b 0a 20 20 20 20 70 54 73 64 2d 3e 70 50   ){.    pTsd->pP
116b0 61 67 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ager = pPager->p
116c0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
116d0 20 20 20 50 61 67 65 72 20 2a 70 54 6d 70 3b 0a     Pager *pTmp;.
116e0 20 20 20 20 66 6f 72 28 70 54 6d 70 20 3d 20 70      for(pTmp = p
116f0 54 73 64 2d 3e 70 50 61 67 65 72 3b 20 70 54 6d  Tsd->pPager; pTm
11700 70 2d 3e 70 4e 65 78 74 21 3d 70 50 61 67 65 72  p->pNext!=pPager
11710 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65  ; pTmp=pTmp->pNe
11720 78 74 29 3b 0a 20 20 20 20 70 54 6d 70 2d 3e 70  xt);.    pTmp->p
11730 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d 3e 70  Next = pPager->p
11740 4e 65 78 74 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Next;.  }.#endif
11750 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ..  sqliteFree(p
11760 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
11770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
11780 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
11790 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
117a0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64  the given page d
117b0 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c  ata..*/.Pgno sql
117c0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75  ite3pager_pagenu
117d0 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61  mber(void *pData
117e0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
117f0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
11800 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
11810 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ->pgno;.}../*.**
11820 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20   The page_ref() 
11830 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65  function increme
11840 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  nts the referenc
11850 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
11860 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  ge..** If the pa
11870 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
11880 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  on the freelist 
11890 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63  (the reference c
118a0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68  ount is zero) th
118b0 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20  en.** remove it 
118c0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
118d0 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e  t..**.** For non
118e0 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70  -test systems, p
118f0 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d  age_ref() is a m
11900 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20  acro that calls 
11910 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f  _page_ref().** o
11920 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66  nline of the ref
11930 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
11940 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20  zero.  For test 
11950 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65  systems, page_re
11960 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c  f().** is a real
11970 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61   function so tha
11980 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65  t we can set bre
11990 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61  akpoints and tra
119a0 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ce it..*/.static
119b0 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28   void _page_ref(
119c0 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
119d0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
119e0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
119f0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
11a00 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  on the freelist.
11a10 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a    Remove it. */.
11a20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67      if( pPg==pPg
11a30 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
11a40 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20  Synced ){.      
11a50 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e  PgHdr *p = pPg->
11a60 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20  pNextFree;.     
11a70 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
11a80 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20  needSync ){ p = 
11a90 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a  p->pNextFree; }.
11aa0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
11ab0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
11ac0 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = p;.    }.    i
11ad0 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65  f( pPg->pPrevFre
11ae0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
11af0 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
11b00 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
11b10 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  tFree;.    }else
11b20 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
11b30 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
11b40 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
11b50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
11b60 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20  >pNextFree ){.  
11b70 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
11b80 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20  ee->pPrevFree = 
11b90 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a  pPg->pPrevFree;.
11ba0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11bb0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c   pPg->pPager->pL
11bc0 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ast = pPg->pPrev
11bd0 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
11be0 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65  pPg->pPager->nRe
11bf0 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  f++;.  }.  pPg->
11c00 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46  nRef++;.  REFINF
11c10 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66  O(pPg);.}.#ifdef
11c20 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
11c30 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
11c40 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
11c50 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
11c60 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
11c70 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a  _page_ref(pPg);.
11c80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11c90 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pPg->nRef++;.  
11ca0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
11cb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
11cc0 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f  e.# define page_
11cd0 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e  ref(P)   ((P)->n
11ce0 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66  Ref==0?_page_ref
11cf0 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e  (P):(void)(P)->n
11d00 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f  Ref++).#endif../
11d10 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74  *.** Increment t
11d20 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
11d30 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20  nt for a page.  
11d40 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65  The input pointe
11d50 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  r is.** a refere
11d60 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  nce to the page 
11d70 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  data..*/.int sql
11d80 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f  ite3pager_ref(vo
11d90 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
11da0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
11db0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
11dc0 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29  .  page_ref(pPg)
11dd0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
11de0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
11df0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  ync the journal.
11e00 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
11e10 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20  , make sure all 
11e20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68  the pages that h
11e30 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74  ave.** been writ
11e40 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ten to the journ
11e50 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79  al have actually
11e60 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72   reached the sur
11e70 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  face of the.** d
11e80 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20  isk.  It is not 
11e90 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74  safe to modify t
11ea0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
11eb0 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20  base file until 
11ec0 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75  after.** the jou
11ed0 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79  rnal has been sy
11ee0 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72  nced.  If the or
11ef0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
11f00 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f  is modified befo
11f10 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  re.** the journa
11f20 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20  l is synced and 
11f30 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
11f40 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79  occurs, the unsy
11f50 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  nced journal.** 
11f60 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f  data would be lo
11f70 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20  st and we would 
11f80 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d  be unable to com
11f90 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b  pletely rollback
11fa0 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
11fb0 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62   changes.  Datab
11fc0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
11fd0 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a  ould occur..** .
11fe0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11ff0 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65  also updates the
12000 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74   nRec field in t
12010 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
12020 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65   journal..** (Se
12030 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68  e comments on th
12040 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  e pager_playback
12050 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61  () routine for a
12060 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
12070 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68  ation.).** If th
12080 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46  e sync mode is F
12090 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77  ULL, two syncs w
120a0 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73  ill occur.  Firs
120b0 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72  t the whole jour
120c0 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64  nal.** is synced
120d0 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20  , then the nRec 
120e0 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
120f0 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20  , then a second 
12100 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a  sync occurs..**.
12110 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79  ** For temporary
12120 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64   databases, we d
12130 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65  o not care if we
12140 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c   are able to rol
12150 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61  lback.** after a
12160 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
12170 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  so sync occurs..
12180 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
12190 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65  ne clears the ne
121a0 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20  edSync field of 
121b0 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65  every page curre
121c0 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65  nt held in.** me
121d0 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mory..*/.static 
121e0 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
121f0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
12200 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
12210 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12220 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74  OK;..  /* Sync t
12230 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  he journal befor
12240 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
12250 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20  main database.  
12260 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65  ** (assuming the
12270 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20  re is a journal 
12280 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20  and it needs to 
12290 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f  be synced.).  */
122a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
122b0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69  eedSync ){.    i
122c0 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
122d0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73  File ){.      as
122e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
122f0 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20  urnalOpen );.   
12300 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70     /* assert( !p
12310 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b  Pager->noSync );
12320 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74   // noSync might
12330 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68   be set if synch
12340 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  ronous.      ** 
12350 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61  was turned off a
12360 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63  fter the transac
12370 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64  tion was started
12380 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a  .  Ticket #615 *
12390 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
123a0 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
123b0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
123c0 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63  e pPager->nRec c
123d0 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65  ounter we are ke
123e0 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20  eping agrees.   
123f0 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65       ** with the
12400 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66   nRec computed f
12410 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20  rom the size of 
12420 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12430 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
12440 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20       i64 jSz;.  
12450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12460 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
12470 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
12480 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
12490 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
124a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
124b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
124c0 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
124d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
124e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
124f0 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
12500 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
12510 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
12520 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
12530 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
12540 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
12550 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
12560 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
12570 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
12580 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
12590 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
125a0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
125b0 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
125c0 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
125d0 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
125e0 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
125f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
12600 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
12610 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
12620 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
12630 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
12640 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
12650 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
12660 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
12670 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20  er->jfd, 0);.   
12680 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
12690 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
126a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
126b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
126c0 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a  ek(pPager->jfd,.
126d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
126e0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
126f0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
12700 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
12710 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20  agic));.        
12720 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
12730 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  rc;.        rc =
12740 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
12750 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
12760 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20  ->nRec);.       
12770 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
12780 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63   rc;..        rc
12790 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
127a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
127b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
127c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
127d0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
127e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41       }.      TRA
127f0 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE2("SYNC journa
12800 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
12810 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
12820 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12830 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
12840 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
12850 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  Sync);.      if(
12860 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
12870 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  rc;.      pPager
12880 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
12890 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
128a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
128b0 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72   = 0;..    /* Er
128c0 61 73 65 20 74 68 65 20 6e 65 65 64 53 79 6e 63  ase the needSync
128d0 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65 72 79   flag from every
128e0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
128f0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
12900 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
12910 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
12920 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
12930 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Sync = 0;.    }.
12940 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
12950 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65  stSynced = pPage
12960 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  r->pFirst;.  }..
12970 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
12980 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67 65 72   /* If the Pager
12990 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69  .needSync flag i
129a0 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74 68 65  s clear then the
129b0 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
129c0 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74 20 61    ** flag must a
129d0 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66 6f 72  lso be clear for
129e0 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56 65 72   all pages.  Ver
129f0 69 66 79 20 74 68 61 74 20 74 68 69 73 0a 20 20  ify that this.  
12a00 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69 73 20  ** invariant is 
12a10 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73  true..  */.  els
12a20 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  e{.    for(pPg=p
12a30 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
12a40 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
12a50 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73 65  All){.      asse
12a60 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
12a70 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  c==0 );.    }.  
12a80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12a90 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d  ->pFirstSynced==
12aa0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 29  pPager->pFirst )
12ab0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
12ac0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12ad0 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
12ae0 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
12af0 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
12b00 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
12b10 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
12b20 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
12b30 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
12b40 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
12b50 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
12b60 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
12b70 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
12b80 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
12b90 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
12ba0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
12bb0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
12bc0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
12bd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
12be0 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
12bf0 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
12c00 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
12c10 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
12c20 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
12c30 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
12c40 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
12c50 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
12c60 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
12c70 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
12c80 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
12c90 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
12ca0 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
12cb0 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
12cc0 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
12cd0 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
12ce0 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
12cf0 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
12d00 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
12d10 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
12d20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
12d30 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
12d40 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
12d50 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
12d60 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
12d70 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
12d80 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
12d90 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
12da0 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
12db0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
12dc0 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
12dd0 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
12de0 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
12df0 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
12e00 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
12e10 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
12e20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
12e30 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
12e40 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
12e50 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
12e60 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
12e70 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
12e80 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
12e90 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
12ea0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
12eb0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
12ec0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
12ed0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
12ee0 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
12ef0 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
12f00 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
12f10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
12f20 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
12f30 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
12f40 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
12f50 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
12f60 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
12f70 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
12f80 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
12f90 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
12fa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12fb0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
12fc0 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  rc;.  }..  while
12fd0 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
12fe0 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
12ff0 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  rty );.    rc = 
13000 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
13010 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74  ager->fd, (pList
13020 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
13030 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
13040 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
13050 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 2f 2a  eturn rc;.    /*
13060 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
13070 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
13080 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
13090 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
130a0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
130b0 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
130c0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
130d0 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
130e0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
130f0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
13100 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
13110 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
13120 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
13130 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
13140 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
13150 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
13160 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
13170 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
13180 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
13190 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
131a0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
131b0 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
131c0 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54  gno, 6);.      T
131d0 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20  RACE3("STORE %d 
131e0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
131f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
13200 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  st->pgno);.     
13210 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
13220 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
13230 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
13240 4c 69 73 74 29 2c 0a 20 20 20 20 20 20 20 20 20  List),.         
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65      pPager->page
13270 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 43 4f 44  Size);.      COD
13280 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  EC(pPager, PGHDR
13290 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
132a0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29   pList->pgno, 0)
132b0 3b 0a 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43  ;.      TEST_INC
132c0 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
132d0 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
132e0 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
132f0 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  {.      TRACE3("
13300 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
13310 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
13320 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
13330 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gno);.    }.#end
13340 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  if.    if( rc ) 
13350 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
13360 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b  List->dirty = 0;
13370 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
13380 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
13390 4c 69 73 74 2d 3e 70 61 67 65 48 61 73 68 20 3d  List->pageHash =
133a0 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
133b0 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20  pList);.#endif. 
133c0 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74     pList = pList
133d0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20  ->pDirty;.  }.  
133e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
133f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65  ;.}../*.** Colle
13400 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70  ct every dirty p
13410 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79  age into a dirty
13420 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74   list and.** ret
13430 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
13440 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61   the head of tha
13450 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67  t list.  All pag
13460 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63  es are.** collec
13470 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79  ted even if they
13480 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73   are still in us
13490 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  e..*/.static PgH
134a0 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c  dr *pager_get_al
134b0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61  l_dirty_pages(Pa
134c0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
134d0 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74  PgHdr *p, *pList
134e0 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20  ;.  pList = 0;. 
134f0 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
13500 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
13510 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
13520 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
13530 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c    p->pDirty = pL
13540 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74  ist;.      pList
13550 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = p;.    }.  }.
13560 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
13570 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
13580 54 52 55 45 20 69 66 20 74 68 65 72 65 20 69 73  TRUE if there is
13590 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f   a hot journal o
135a0 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
135b0 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72  r..** A hot jour
135c0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
135d0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
135e0 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49  ed back..**.** I
135f0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  f the current si
13600 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ze of the databa
13610 73 65 20 66 69 6c 65 20 69 73 20 30 20 62 75 74  se file is 0 but
13620 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a   a journal file.
13630 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61 74 20  ** exists, that 
13640 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f  is probably an o
13650 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20  ld journal left 
13660 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f  over from a prio
13670 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69  r.** database wi
13680 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  th the same name
13690 2e 20 20 4a 75 73 74 20 64 65 6c 65 74 65 20 74  .  Just delete t
136a0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73  he journal..*/.s
136b0 74 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74  tatic int hasHot
136c0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
136d0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 21 70  Pager){.  if( !p
136e0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
136f0 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  l ) return 0;.  
13700 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 46 69  if( !sqlite3OsFi
13710 6c 65 45 78 69 73 74 73 28 70 50 61 67 65 72 2d  leExists(pPager-
13720 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20 72 65 74  >zJournal) ) ret
13730 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
13740 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
13750 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  vedLock(pPager->
13760 66 64 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  fd) ) return 0;.
13770 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67    if( sqlite3pag
13780 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
13790 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ger)==0 ){.    s
137a0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
137b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29  Pager->zJournal)
137c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
137d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
137e0 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
137f0 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20  .** Try to find 
13800 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  a page in the ca
13810 63 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  che that can be 
13820 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a  recycled. .**.**
13830 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
13840 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
13850 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55  IOERR, SQLITE_FU
13860 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e  LL or SQLITE_OK.
13870 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74   It .** does not
13880 20 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d   set the pPager-
13890 3e 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c  >errMask variabl
138a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
138b0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50   pager_recycle(P
138c0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
138d0 74 20 73 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20  t syncOk, PgHdr 
138e0 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72  **ppPg){.  PgHdr
138f0 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d   *pPg;.  *ppPg =
13900 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61   0;..  /* Find a
13910 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
13920 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65  .  Try to locate
13930 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
13940 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69  s not.  ** requi
13950 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66  re us to do an f
13960 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f  sync() on the jo
13970 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50  urnal..  */.  pP
13980 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
13990 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
139a0 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
139b0 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
139c0 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
139d0 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
139e0 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
139f0 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
13a00 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
13a10 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
13a20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
13a30 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
13a40 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
13a50 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
13a60 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
13a70 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
13a80 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
13a90 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
13aa0 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d   && syncOk && !M
13ab0 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72  EMDB){.    int r
13ac0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
13ad0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
13ae0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
13af0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
13b00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
13b10 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
13b20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
13b30 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
13b40 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
13b50 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
13b60 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
13b70 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
13b80 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
13b90 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
13ba0 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68  urnal.      ** h
13bb0 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
13bc0 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
13bd0 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
13be0 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20  that have.      
13bf0 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
13c00 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
13c10 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
13c20 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20   the header is. 
13c30 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20       ** trashed 
13c40 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
13c50 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
13c60 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13c70 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
13c80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13c90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13ca0 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
13cb0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
13cc0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
13cd0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
13ce0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13cf0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
13d00 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61 67  }.    pPg = pPag
13d10 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d 0a  er->pFirst;.  }.
13d20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
13d30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13d40 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  E_OK;.  }..  ass
13d50 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d  ert( pPg->nRef==
13d60 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65  0 );..  /* Write
13d70 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
13d80 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
13d90 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20  f it is dirty.. 
13da0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 64   */.  if( pPg->d
13db0 69 72 74 79 20 29 7b 0a 20 20 20 20 69 6e 74 20  irty ){.    int 
13dc0 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
13dd0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
13de0 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   );.    pPg->pDi
13df0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
13e00 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
13e10 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
13e20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
13e30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
13e40 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
13e50 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
13e60 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
13e70 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
13e80 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
13e90 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
13ea0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
13eb0 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
13ec0 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
13ed0 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
13ee0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
13ef0 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
13f00 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
13f10 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
13f20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
13f30 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
13f40 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
13f50 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
13f60 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
13f70 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
13f80 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72  .  ** might be r
13f90 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
13fa0 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
13fb0 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
13fc0 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 2a 2a  't remember.  **
13fd0 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
13fe0 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
13ff0 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
14000 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
14010 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61 72 6b  ust.  ** be mark
14020 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
14030 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
14040 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  n out..  */.  if
14050 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
14060 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 50 61  lback ){.    pPa
14070 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
14080 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ack = 1;.  }..  
14090 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
140a0 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
140b0 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
140c0 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a  e hash table.  *
140d0 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70  /.  unlinkPage(p
140e0 50 67 29 3b 0a 20 20 54 45 53 54 5f 49 4e 43 52  Pg);.  TEST_INCR
140f0 28 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b  (pPager->nOvfl);
14100 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
14110 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14120 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
14130 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
14140 61 6c 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75  alled to free su
14150 70 65 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69  perfluous dynami
14160 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  cally allocated 
14170 6d 65 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62  memory.** held b
14180 79 20 74 68 65 20 70 61 67 65 72 20 73 79 73 74  y the pager syst
14190 65 6d 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73  em. Memory in us
141a0 65 20 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20  e by any SQLite 
141b0 70 61 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a  pager allocated.
141c0 2a 2a 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ** by the curren
141d0 74 20 74 68 72 65 61 64 20 6d 61 79 20 62 65 20  t thread may be 
141e0 73 71 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a  sqliteFree()ed..
141f0 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
14200 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
14210 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
14220 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
14230 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
14240 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
14250 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
14260 20 41 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   A negative valu
14270 65 20 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73  e for nReq means
14280 0a 2a 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68  .** free as much
14290 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
142a0 62 6c 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20  ble. The return 
142b0 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74  value is the tot
142c0 61 6c 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66  al number .** of
142d0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
142e0 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69   released..*/.#i
142f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14300 54 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  T_MEMORY_MANAGEM
14310 45 4e 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  ENT.int sqlite3p
14320 61 67 65 72 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ager_release_mem
14330 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20  ory(int nReq){. 
14340 20 53 71 6c 69 74 65 54 73 64 20 2a 70 54 73 64   SqliteTsd *pTsd
14350 20 3d 20 73 71 6c 69 74 65 33 54 73 64 28 29 3b   = sqlite3Tsd();
14360 0a 20 20 50 61 67 65 72 20 2a 70 3b 0a 20 20 69  .  Pager *p;.  i
14370 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30  nt nReleased = 0
14380 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a  ;.  int i;..  /*
14390 20 49 66 20 74 68 65 20 64 69 73 61 62 6c 65 52   If the disableR
143a0 65 6c 65 61 73 65 4d 65 6d 6f 72 79 20 6d 65 6d  eleaseMemory mem
143b0 6f 72 79 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ory flag is set,
143c0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
143d0 69 73 0a 20 20 2a 2a 20 61 20 6e 6f 2d 6f 70 3b  is.  ** a no-op;
143e0 20 7a 65 72 6f 20 62 79 74 65 73 20 6f 66 20 6d   zero bytes of m
143f0 65 6d 6f 72 79 20 61 72 65 20 66 72 65 65 64 2e  emory are freed.
14400 20 54 68 65 20 66 6c 61 67 20 69 73 20 73 65 74   The flag is set
14410 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 6d 61 6c   before.  ** mal
14420 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20  loc() is called 
14430 77 68 69 6c 65 20 74 68 65 20 67 6c 6f 62 61 6c  while the global
14440 20 6d 75 74 65 78 20 28 73 65 65 20 73 71 6c 69   mutex (see sqli
14450 74 65 33 4f 73 45 6e 74 65 72 4d 75 74 65 78 29  te3OsEnterMutex)
14460 20 0a 20 20 2a 2a 20 69 73 20 68 65 6c 64 2e 20   .  ** is held. 
14470 42 65 63 61 75 73 65 20 73 6f 6d 65 20 6f 66 20  Because some of 
14480 74 68 65 20 63 6f 64 65 20 69 6e 76 6f 6b 65 64  the code invoked
14490 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
144a0 6e 20 6d 61 79 20 61 6c 73 6f 0a 20 20 2a 2a 20  n may also.  ** 
144b0 74 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  try to obtain th
144c0 65 20 6d 75 74 65 78 2c 20 70 72 6f 63 65 64 69  e mutex, procedi
144d0 6e 67 20 6d 61 79 20 63 61 75 73 65 20 61 20 64  ng may cause a d
144e0 65 61 64 6c 6f 63 6b 2e 20 0a 20 20 2a 2f 0a 20  eadlock. .  */. 
144f0 20 69 66 28 20 70 54 73 64 2d 3e 64 69 73 61 62   if( pTsd->disab
14500 6c 65 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79 20  leReleaseMemory 
14510 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
14520 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 75 74 65 72  .  }..  /* Outer
14530 6d 6f 73 74 20 6c 6f 6f 70 20 72 75 6e 73 20 66  most loop runs f
14540 6f 72 20 61 74 20 6d 6f 73 74 20 74 77 6f 20 69  or at most two i
14550 74 65 72 61 74 69 6f 6e 73 2e 20 46 69 72 73 74  terations. First
14560 20 69 74 65 72 61 74 69 6f 6e 20 77 65 0a 20 20   iteration we.  
14570 2a 2a 20 74 72 79 20 74 6f 20 66 69 6e 64 20 6d  ** try to find m
14580 65 6d 6f 72 79 20 74 68 61 74 20 63 61 6e 20 62  emory that can b
14590 65 20 72 65 6c 65 61 73 65 64 20 77 69 74 68 6f  e released witho
145a0 75 74 20 63 61 6c 6c 69 6e 67 20 66 73 79 6e 63  ut calling fsync
145b0 28 29 2e 20 53 65 63 6f 6e 64 0a 20 20 2a 2a 20  (). Second.  ** 
145c0 69 74 65 72 61 74 69 6f 6e 20 28 77 68 69 63 68  iteration (which
145d0 20 6f 6e 6c 79 20 72 75 6e 73 20 69 66 20 74 68   only runs if th
145e0 65 20 66 69 72 73 74 20 66 61 69 6c 65 64 20 74  e first failed t
145f0 6f 20 66 72 65 65 20 6e 52 65 71 20 62 79 74 65  o free nReq byte
14600 73 20 6f 66 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  s of.  ** memory
14610 29 20 69 73 20 70 65 72 6d 69 74 74 65 64 20 74  ) is permitted t
14620 6f 20 63 61 6c 6c 20 66 73 79 6e 63 28 29 2e 20  o call fsync(). 
14630 54 68 69 73 20 69 73 20 6f 66 20 63 6f 75 72 73  This is of cours
14640 65 20 6d 75 63 68 20 6d 6f 72 65 20 0a 20 20 2a  e much more .  *
14650 2a 20 65 78 70 65 6e 73 69 76 65 2e 0a 20 20 2a  * expensive..  *
14660 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3d 3d  /.  for(i=0; i==
14670 30 20 7c 7c 20 69 3d 3d 31 3b 20 69 2b 2b 29 7b  0 || i==1; i++){
14680 0a 0a 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68  ..    /* Loop th
14690 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 53 51  rough all the SQ
146a0 4c 69 74 65 20 70 61 67 65 72 73 20 6f 70 65 6e  Lite pagers open
146b0 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65 6e  ed by the curren
146c0 74 20 74 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20  t thread. */.   
146d0 20 66 6f 72 28 70 3d 70 54 73 64 2d 3e 70 50 61   for(p=pTsd->pPa
146e0 67 65 72 3b 20 70 20 26 26 20 28 6e 52 65 71 3c  ger; p && (nReq<
146f0 30 20 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e  0 || nReleased<n
14700 52 65 71 29 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  Req); p=p->pNext
14710 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  ){.      PgHdr *
14720 70 50 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 72  pPg;.      int r
14730 63 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f 72  c;..      /* For
14740 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72 79   each pager, try
14750 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e 79   to free as many
14760 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69 62   pages as possib
14770 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20 20  le (without .   
14780 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66 73     ** calling fs
14790 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69 73  ync() if this is
147a0 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72 61   the first itera
147b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74 65  tion of the oute
147c0 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  rmost .      ** 
147d0 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  loop)..      */.
147e0 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c        while( SQL
147f0 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70 61  ITE_OK==(rc = pa
14800 67 65 72 5f 72 65 63 79 63 6c 65 28 70 2c 20 69  ger_recycle(p, i
14810 2c 20 26 70 50 67 29 29 20 26 26 20 70 50 67 29  , &pPg)) && pPg)
14820 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65   {.        /* We
14830 27 76 65 20 66 6f 75 6e 64 20 61 20 70 61 67 65  've found a page
14840 20 74 6f 20 66 72 65 65 2e 20 41 74 20 74 68 69   to free. At thi
14850 73 20 70 6f 69 6e 74 20 74 68 65 20 70 61 67 65  s point the page
14860 20 68 61 73 20 62 65 65 6e 20 0a 20 20 20 20 20   has been .     
14870 20 20 20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72     ** removed fr
14880 6f 6d 20 74 68 65 20 70 61 67 65 20 68 61 73 68  om the page hash
14890 2d 74 61 62 6c 65 2c 20 66 72 65 65 2d 6c 69 73  -table, free-lis
148a0 74 20 61 6e 64 20 73 79 6e 63 65 64 2d 6c 69 73  t and synced-lis
148b0 74 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 70  t .        ** (p
148c0 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20 49 74  FirstSynced). It
148d0 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74 68 65   is still in the
148e0 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41 6c 6c   all pages (pAll
148f0 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20  ) list. .       
14900 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
14910 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
14920 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
14930 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
14940 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74  ** Todo: Check t
14950 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c  he Pager.pStmt l
14960 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ist to make sure
14970 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20   this is Ok. It 
14980 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 62  .        ** prob
14990 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a  ably is though..
149a0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
149b0 20 20 20 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a     PgHdr *pTmp;.
149c0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
149d0 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 70  pPg );.        p
149e0 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
149f0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
14a00 20 20 20 20 20 20 20 20 69 66 28 20 70 50 67 3d          if( pPg=
14a10 3d 70 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  =p->pAll ){.    
14a20 20 20 20 20 20 20 20 70 2d 3e 70 41 6c 6c 20 3d         p->pAll =
14a30 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
14a40 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14a50 20 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54           for( pT
14a60 6d 70 3d 70 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70  mp=p->pAll; pTmp
14a70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50 67 3b  ->pNextAll!=pPg;
14a80 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e 65 78   pTmp=pTmp->pNex
14a90 74 41 6c 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  tAll );.        
14aa0 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c    pTmp->pNextAll
14ab0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
14ac0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14ad0 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d      nReleased +=
14ae0 20 73 71 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65   sqliteAllocSize
14af0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 73  (pPg);.        s
14b00 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
14b10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
14b20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14b30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
14b40 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  n error occured 
14b50 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74  whilst writing t
14b60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
14b70 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 20 20  ile or .        
14b80 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61  ** journal in pa
14b90 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54  ger_recycle(). T
14ba0 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20  he error is not 
14bb0 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
14bc0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c  .        ** call
14bd0 65 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  er of this funct
14be0 69 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65  ion. Instead, se
14bf0 74 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 4d  t the Pager.errM
14c00 61 73 6b 20 76 61 72 69 61 62 6c 65 2e 0a 20 20  ask variable..  
14c10 20 20 20 20 20 20 2a 2a 20 54 68 65 20 65 72 72        ** The err
14c20 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  or will be retur
14c30 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20  ned to the user 
14c40 28 6f 72 20 75 73 65 72 73 2c 20 69 6e 20 74 68  (or users, in th
14c50 65 20 63 61 73 65 20 0a 20 20 20 20 20 20 20 20  e case .        
14c60 2a 2a 20 6f 66 20 61 20 73 68 61 72 65 64 20 70  ** of a shared p
14c70 61 67 65 72 20 63 61 63 68 65 29 20 6f 66 20 74  ager cache) of t
14c80 68 65 20 70 61 67 65 72 20 66 6f 72 20 77 68 69  he pager for whi
14c90 63 68 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  ch the error occ
14ca0 75 72 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ured..        */
14cb0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14cc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
14cd0 52 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  R || rc==SQLITE_
14ce0 46 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 20 20  FULL );.        
14cf0 61 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65  assert( p->state
14d00 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
14d10 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65   );.        page
14d20 72 5f 65 72 72 6f 72 28 70 2c 20 72 63 29 3b 0a  r_error(p, rc);.
14d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14d40 7d 0a 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c  }..  return nRel
14d50 65 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20  eased;.}.#endif 
14d60 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  /* SQLITE_OMIT_M
14d70 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
14d80 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69   */../*.** Acqui
14d90 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  re a page..**.**
14da0 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   A read lock on 
14db0 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73  the disk file is
14dc0 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74   obtained when t
14dd0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73  he first page is
14de0 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54   acquired. .** T
14df0 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73  his read lock is
14e00 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68   dropped when th
14e10 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  e last page is r
14e20 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  eleased..**.** A
14e30 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20   _get works for 
14e40 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20  any page number 
14e50 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20  greater than 0. 
14e60 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
14e70 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c  .** file is smal
14e80 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71  ler than the req
14e90 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65  uested page, the
14ea0 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b  n no actual disk
14eb0 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20  .** read occurs 
14ec0 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69  and the memory i
14ed0 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  mage of the page
14ee0 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
14ef0 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e  to.** all zeros.
14f00 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61    The extra data
14f10 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
14f20 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
14f30 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20  itialized.** to 
14f40 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20  zeros the first 
14f50 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c  time a page is l
14f60 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72  oaded into memor
14f70 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71  y..**.** The acq
14f80 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66  uisition might f
14f90 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20  ail for several 
14fa0 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c  reasons.  In all
14fb0 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70   cases,.** an ap
14fc0 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
14fd0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
14fe0 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20   and *ppPage is 
14ff0 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a  set to NULL..**.
15000 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
15010 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
15020 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f  ).  Both this ro
15030 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75  utine and _looku
15040 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74  p() attempt.** t
15050 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e  o find a page in
15060 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
15070 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20  ache first.  If 
15080 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
15090 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65  already.** in me
150a0 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69  mory, this routi
150b0 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20  ne goes to disk 
150c0 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68  to read it in wh
150d0 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a  ereas _lookup().
150e0 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20  ** just returns 
150f0 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  0.  This routine
15100 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64   acquires a read
15110 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20  -lock the first 
15120 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74  time it.** has t
15130 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e  o go to disk, an
15140 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61  d could also pla
15150 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75  yback an old jou
15160 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72  rnal if necessar
15170 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f  y..** Since _loo
15180 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
15190 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
151a0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
151b0 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
151c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
151d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
151e0 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50  er_get(Pager *pP
151f0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c  ager, Pgno pgno,
15200 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b   void **ppPage){
15210 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
15220 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
15230 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
15240 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20  number is 2^31. 
15250 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  Return SQLITE_CO
15260 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a  RRUPT if a page.
15270 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61    ** number grea
15280 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f  ter than this, o
15290 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65  r zero, is reque
152a0 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  sted..  */.  if(
152b0 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f   pgno>PAGER_MAX_
152c0 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20  PGNO || pgno==0 
152d0 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
152e0 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
152f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
15300 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
15310 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
15320 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
15330 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
15340 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
15350 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15360 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
15370 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
15380 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
15390 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
153a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
153b0 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
153c0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
153d0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
153e0 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
153f0 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
15400 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
15410 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15420 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
15430 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
15440 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20   && !MEMDB ){.  
15450 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
15460 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
15470 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
15480 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
15490 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
154a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
154b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
154c0 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
154d0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
154e0 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
154f0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  }..    /* If a j
15500 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
15510 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
15520 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
15530 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
15540 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
15550 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
15560 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
15570 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
15580 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
15590 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
155a0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
155b0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20   int rc;..      
155c0 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55   /* Get an EXCLU
155d0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
155e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
155f0 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
15600 20 69 73 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d   is.       ** im
15610 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
15620 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
15630 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
15640 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
15650 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49        ** EXCLUSI
15660 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77  VE lock. If it w
15670 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f  ere, another pro
15680 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
15690 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61  the.       ** da
156a0 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74  tabase file, det
156b0 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44  ect the RESERVED
156c0 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c   lock, and concl
156d0 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ude that the.   
156e0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
156f0 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20  is safe to read 
15700 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65  while this proce
15710 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c  ss is still roll
15720 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 2a  ing it .       *
15730 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a  * back..       *
15740 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20 42 65 63  * .       ** Bec
15750 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65  ause the interme
15760 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c  diate RESERVED l
15770 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65  ock is not reque
15780 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20  sted, the.      
15790 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65   ** second proce
157a0 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74  ss will get to t
157b0 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  his point in the
157c0 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74   code and fail t
157d0 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61  o.       ** obta
157e0 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c  in it's own EXCL
157f0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
15800 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
15810 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
15820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15830 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
15840 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
15850 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
15860 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
15880 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
15890 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
158a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
158b0 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
158c0 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74  CK;.         ret
158d0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
158e0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
158f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61      }.       pPa
15900 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
15910 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20  ER_EXCLUSIVE;.. 
15920 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
15930 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
15940 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74  ading only.  Ret
15950 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
15960 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20  if.       ** we 
15970 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  are unable to op
15980 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
15990 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a  ile. .       **.
159a0 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
159b0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
159c0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
159d0 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
159e0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he.       ** jou
159f0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76  rnal file is nev
15a00 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74  er open unless t
15a10 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15a20 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20   file holds.    
15a30 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f     ** a write lo
15a40 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20  ck, so there is 
15a50 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65  never any chance
15a60 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a   of two or more.
15a70 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
15a80 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
15a90 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
15aa0 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
15ab0 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20   */.       rc = 
15ac0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
15ad0 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a  dOnly(pPager->zJ
15ae0 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d  ournal, &pPager-
15af0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66  >jfd);.       if
15b00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15b10 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
15b20 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67  te3OsUnlock(pPag
15b30 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
15b40 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65  ;.         pPage
15b50 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
15b60 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  _UNLOCK;.       
15b70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15b80 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20  BUSY;.       }. 
15b90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
15ba0 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
15bb0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
15bc0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
15bd0 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
15be0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
15bf0 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
15c00 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
15c10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
15c20 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20  urnalHdr = 0;.. 
15c30 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63        /* Playbac
15c40 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  k and delete the
15c50 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20   journal.  Drop 
15c60 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69  the database wri
15c70 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63  te.       ** loc
15c80 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20  k and reacquire 
15c90 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20  the read lock.. 
15ca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
15cb0 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
15cc0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
15cd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15cf0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
15d00 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
15d10 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ;.       }.    }
15d20 0a 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20  .    pPg = 0;.  
15d30 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
15d40 61 72 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e  arch for page in
15d50 20 63 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50   cache */.    pP
15d60 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
15d70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
15d80 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26      if( MEMDB &&
15d90 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
15da0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a  PAGER_UNLOCK ){.
15db0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
15dc0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
15dd0 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ED;.    }.  }.  
15de0 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
15df0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
15e00 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  ed page is not i
15e10 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
15e20 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a  . */.    int h;.
15e30 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
15e40 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
15e50 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50    if( pPager->nP
15e60 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61  age<pPager->mxPa
15e70 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46  ge || pPager->pF
15e80 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42  irst==0 || MEMDB
15e90 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65   ){.      /* Cre
15ea0 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a  ate a new page *
15eb0 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71  /.      pPg = sq
15ec0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
15ed0 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
15ee0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
15ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
15f10 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
15f20 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
15f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f40 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
15f50 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
15f60 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ry) );.      if(
15f70 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
15f80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15f90 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
15fa0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
15fb0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67  , 0, sizeof(*pPg
15fc0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45  ));.      if( ME
15fd0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  MDB ){.        m
15fe0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48  emset(PGHDR_TO_H
15ff0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
16000 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69  , 0, sizeof(PgHi
16010 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d  story));.      }
16020 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
16030 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
16040 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c     pPg->pNextAll
16050 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b   = pPager->pAll;
16060 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
16070 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20  All = pPg;.     
16080 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
16090 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
160a0 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65 72  er->nPage>pPager
160b0 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20 20  ->nMaxPage ){.  
160c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
160d0 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d  ager->nMaxPage==
160e0 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 31  (pPager->nPage-1
160f0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ) );.        pPa
16100 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b  ger->nMaxPage++;
16110 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
16120 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
16130 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
16140 67 65 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20  ger, 1, &pPg);. 
16150 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16160 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16170 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
16180 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
16190 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
161a0 61 73 73 65 72 74 28 70 50 67 29 20 3b 0a 20 20  assert(pPg) ;.  
161b0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
161c0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
161d0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
161e0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
161f0 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
16200 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
16210 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
16220 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
16230 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20  rnal, pgno/8);. 
16240 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
16250 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
16260 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
16270 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
16280 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
16290 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
162a0 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
162b0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
162c0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
162d0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
162e0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
162f0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
16300 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
16310 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
16320 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
16330 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a  Pager->stmtSize.
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
16350 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
16360 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
16370 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a  pgno&7)))!=0 ){.
16380 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
16390 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
163a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
163b0 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
163c0 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
163d0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
163e0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
163f0 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
16400 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
16410 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
16420 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70  Ref++;.    h = p
16430 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
16440 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
16450 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
16460 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
16470 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
16480 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
16490 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
164a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
164b0 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
164c0 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
164d0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
164e0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
164f0 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
16500 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
16510 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
16520 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
16530 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
16540 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
16550 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
16560 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
16570 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
16580 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
16590 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
165a0 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g));.      rc = 
165b0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
165c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ager);.      ret
165d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
165e0 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67    if( sqlite3pag
165f0 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
16600 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20 29  ger)<(int)pgno )
16610 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
16620 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16630 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
16640 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  geSize);.    }el
16650 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
16660 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16670 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20  MEMDB==0 );.    
16680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16690 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
166a0 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70   (pgno-1)*(i64)p
166b0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
166c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
166d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
166e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
166f0 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
16700 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
16710 41 28 70 50 67 29 2c 0a 20 20 20 20 20 20 20 20  A(pPg),.        
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
16740 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
16750 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46  .      TRACE3("F
16760 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
16770 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
16780 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
16790 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
167a0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
167b0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
167c0 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66  no, 3);.      if
167d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
167e0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 66  ){.        i64 f
167f0 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ileSize;.       
16800 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
16810 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
16820 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51  d,&fileSize)!=SQ
16830 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
16840 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69         || fileSi
16850 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d  ze>=pgno*pPager-
16860 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
16870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
16880 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
16890 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
168a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
168b0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
168c0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
168d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
168e0 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74 65    clear_simulate
168f0 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20 20  d_io_error();.  
16900 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
16910 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16920 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
16930 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
16940 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
16950 20 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43          TEST_INC
16960 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
16970 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16980 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
16990 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
169a0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
169b0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
169c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
169d0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
169e0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
169f0 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
16a00 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54 5f 49  e. */.    TEST_I
16a10 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
16a20 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  );.    page_ref(
16a30 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
16a40 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  age = PGHDR_TO_D
16a50 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ATA(pPg);.  retu
16a60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
16a70 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
16a80 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
16a90 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
16aa0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
16ab0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
16ac0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
16ad0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
16ae0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
16af0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
16b00 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
16b10 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
16b20 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
16b30 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64  er_get().  The d
16b40 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
16b50 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
16b60 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67  * and sqlite3pag
16b70 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74  er_get() is that
16b80 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
16b90 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
16ba0 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
16bb0 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
16bc0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
16bd0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
16be0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
16bf0 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
16c00 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
16c10 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
16c20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
16c30 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
16c40 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
16c50 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  3pager_lookup(Pa
16c60 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
16c70 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
16c80 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
16c90 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
16ca0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
16cb0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
16cc0 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
16cd0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
16ce0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
16cf0 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
16d00 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16d10 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
16d20 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16d30 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
16d40 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
16d50 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
16d60 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
16d70 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
16d80 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
16d90 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
16da0 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
16db0 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
16dc0 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
16dd0 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
16de0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
16df0 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
16e00 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
16e10 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
16e20 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
16e30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
16e40 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
16e50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
16e60 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
16e70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
16e80 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
16e90 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
16ea0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
16eb0 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
16ec0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
16ed0 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
16ee0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
16ef0 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
16f00 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
16f10 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
16f20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
16f30 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
16f40 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
16f50 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
16f60 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
16f70 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
16f80 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
16f90 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
16fa0 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
16fb0 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
16fc0 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
16fd0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
16fe0 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
16ff0 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
17000 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
17010 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
17020 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
17030 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
17040 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
17050 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
17060 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
17070 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
17080 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
17090 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
170a0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
170b0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
170c0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
170d0 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
170e0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
170f0 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
17100 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
17110 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
17120 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
17130 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
17140 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
17150 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
17160 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
17170 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
17180 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
17190 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
171a0 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
171b0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
171c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
171d0 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
171e0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
171f0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
17200 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
17210 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
17220 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17230 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
17240 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
17260 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
17270 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
17280 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
17290 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
172a0 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
172b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
172c0 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
172d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
172e0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
172f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
17300 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
17310 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
17320 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
17330 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
17340 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
17350 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
17360 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
17370 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
17380 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
17390 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
173a0 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
173b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
173c0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
173d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
173e0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
173f0 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
17400 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
17410 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
17420 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
17430 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
17440 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
17450 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
17460 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17470 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
17480 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
17490 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
174a0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
174b0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
174c0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
174d0 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
174e0 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
174f0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
17500 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
17510 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
17520 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
17530 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
17540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17550 20 20 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70      pPager->temp
17560 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  File);.  pPager-
17570 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
17580 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
17590 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67  ster = 0;.  pPag
175a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d  er->journalHdr =
175b0 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   0;.  if( rc!=SQ
175c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
175d0 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
175e0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
175f0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
17600 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
17610 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
17620 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  Sync);.  sqlite3
17630 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28 70 50  OsSetFullSync(pP
17640 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
17650 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73  ->fullSync);.  s
17660 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
17670 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 6a 66  ctory(pPager->jf
17680 64 2c 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  d, pPager->zDire
17690 63 74 6f 72 79 29 3b 0a 20 20 70 50 61 67 65 72  ctory);.  pPager
176a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
176b0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
176c0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
176d0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
176e0 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
176f0 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
17700 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
17710 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
17720 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
17730 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
17740 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
17750 61 67 65 72 29 3b 0a 20 20 20 20 67 6f 74 6f 20  ager);.    goto 
17760 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
17770 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50  ournal;.  }.  pP
17780 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
17790 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
177a0 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  e;..  rc = write
177b0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
177c0 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  r);..  if( pPage
177d0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
177e0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
177f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
17800 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62  ite3pager_stmt_b
17810 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
17820 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
17830 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
17840 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
17850 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
17860 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
17870 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17890 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
178a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
178b0 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
178c0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
178d0 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
178e0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
178f0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  l);.  pPager->aI
17900 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
17910 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
17920 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  OMEM ){.    /* I
17930 66 20 74 68 69 73 20 77 61 73 20 61 20 6d 61 6c  f this was a mal
17940 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 74  loc() failure, t
17950 68 65 6e 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20  hen we will not 
17960 62 65 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 70  be closing the p
17970 61 67 65 72 0a 20 20 20 20 2a 2a 20 66 69 6c 65  ager.    ** file
17980 2e 20 53 6f 20 64 65 6c 65 74 65 20 61 6e 79 20  . So delete any 
17990 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 65 20  journal file we 
179a0 6d 61 79 20 68 61 76 65 20 6a 75 73 74 20 63 72  may have just cr
179b0 65 61 74 65 64 2e 20 4f 74 68 65 72 77 69 73 65  eated. Otherwise
179c0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 79 73  ,.    ** the sys
179d0 74 65 6d 20 77 69 6c 6c 20 67 65 74 20 63 6f 6e  tem will get con
179e0 66 75 73 65 64 2c 20 77 65 20 68 61 76 65 20 61  fused, we have a
179f0 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
17a00 65 20 66 69 6c 65 20 61 6e 64 20 61 0a 20 20 20  e file and a.   
17a10 20 2a 2a 20 6d 79 73 74 65 72 69 6f 75 73 20 6a   ** mysterious j
17a20 6f 75 72 6e 61 6c 20 68 61 73 20 61 70 70 65 61  ournal has appea
17a30 72 65 64 20 69 6e 20 74 68 65 20 66 69 6c 65 73  red in the files
17a40 79 73 74 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20  ystem..    */.  
17a50 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
17a60 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
17a70 61 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  al);.  }else{.  
17a80 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
17a90 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
17aa0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67  _LOCK);.    pPag
17ab0 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
17ac0 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20  R_UNLOCK;.  }.  
17ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17ae0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
17af0 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
17b00 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
17b10 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
17b20 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
17b30 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
17b40 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
17b50 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
17b60 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c  commit() is call
17b70 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
17b80 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
17b90 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
17ba0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
17bb0 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63  ger_close() is c
17bc0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
17bd0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
17be0 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
17bf0 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
17c00 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
17c10 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
17c20 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
17c30 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
17c40 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
17c50 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
17c60 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
17c70 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
17c80 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
17c90 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
17ca0 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
17cb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
17cc0 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
17cd0 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
17ce0 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
17cf0 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
17d00 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17d10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
17d20 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
17d30 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
17d40 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
17d50 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
17d60 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
17d70 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
17d80 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
17d90 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
17da0 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
17db0 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
17dc0 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
17dd0 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
17de0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
17df0 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
17e00 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
17e10 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
17e20 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
17e30 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
17e40 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
17e50 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
17e60 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
17e70 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
17e80 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
17e90 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
17ea0 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
17eb0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
17ec0 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
17ed0 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
17ee0 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
17ef0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
17f00 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
17f10 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
17f20 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
17f30 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
17f40 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
17f50 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
17f60 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
17f70 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
17f80 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
17f90 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76  te3pager_begin(v
17fa0 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
17fb0 65 78 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72  exFlag){.  PgHdr
17fc0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
17fd0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
17fe0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
17ff0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
18000 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
18010 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
18020 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
18030 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
18040 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
18050 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
18060 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
18070 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
18080 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
18090 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
180a0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
180b0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
180c0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
180d0 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
180e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
180f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
18100 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
18110 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18120 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
18130 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  , RESERVED_LOCK)
18140 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
18150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18160 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
18170 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
18180 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
18190 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
181a0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
181b0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
181c0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
181d0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
181e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
181f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18200 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
18210 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
18220 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
18230 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
18240 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53 41    TRACE2("TRANSA
18250 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
18260 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
18270 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
18280 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
18290 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
182a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
182b0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
182c0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
182d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
182e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
182f0 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
18300 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
18310 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73  le.  The page is
18320 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
18330 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66  e journal .** if
18340 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
18350 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20   already.  This 
18360 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
18370 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61  called before ma
18380 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
18390 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  to a page..**.**
183a0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
183b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
183c0 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
183d0 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a  r creates a new.
183e0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61  ** journal and a
183f0 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56  cquires a RESERV
18400 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
18410 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
18420 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
18430 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  k could not be a
18440 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  cquired, this ro
18450 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
18460 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a  LITE_BUSY.  The.
18470 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
18480 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f  ne must check fo
18490 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  r that return va
184a0 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66  lue and be caref
184b0 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61  ul not to.** cha
184c0 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
184d0 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75  a until this rou
184e0 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
184f0 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
18500 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
18510 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77  e could not be w
18520 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74  ritten because t
18530 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c  he disk is full,
18540 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
18550 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
18560 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f  LITE_FULL and do
18570 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
18580 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c  rollback..** All
18590 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74   subsequent writ
185a0 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20  e attempts also 
185b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
185c0 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a  LL until there.*
185d0 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73  * is a call to s
185e0 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
185f0 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70  it() or sqlite3p
18600 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
18610 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
18620 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
18630 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61  _write(void *pDa
18640 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
18650 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
18660 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
18670 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18680 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
18690 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
186a0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
186b0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
186c0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
186d0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
186e0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
186f0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
18700 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
18710 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
18720 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
18730 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
18740 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
18750 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
18760 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
18770 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
18780 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
18790 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
187a0 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
187b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
187c0 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
187d0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
187e0 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  /.  pPg->dirty =
187f0 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
18800 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
18810 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67  ->inStmt || pPag
18820 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
18830 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
18840 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
18850 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
18860 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
18870 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
18880 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
18890 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
188a0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
188b0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
188c0 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
188d0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
188e0 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
188f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
18900 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
18910 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
18920 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
18930 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
18940 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
18950 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
18960 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
18970 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
18980 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
18990 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
189a0 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
189b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
189c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
189d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
189e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
189f0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
18a00 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
18a10 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
18a20 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
18a30 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
18a40 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
18a50 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
18a60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
18a70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
18a80 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
18a90 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
18aa0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18ab0 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
18ac0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
18ad0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
18ae0 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
18af0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
18b00 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
18b10 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
18b20 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
18b30 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
18b40 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
18b50 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
18b60 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
18b70 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
18b80 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
18b90 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
18ba0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
18bb0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
18bc0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
18bd0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
18be0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
18bf0 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
18c00 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
18c10 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
18c20 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
18c30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50  .        int szP
18c40 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 73  g;.        u32 s
18c50 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
18c60 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
18c70 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
18c80 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
18c90 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
18ca0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  r);.          TR
18cb0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
18cc0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
18cd0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
18ce0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
18cf0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
18d00 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
18d10 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
18d20 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
18d30 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
18d40 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
18d50 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
18d60 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
18d70 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
18d80 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
18d90 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
18da0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18db0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
18dc0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18dd0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
18de0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  m;.          /* 
18df0 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  We should never 
18e00 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75  write to the jou
18e10 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61  rnal file the pa
18e20 67 65 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ge that.        
18e30 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
18e40 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
18e50 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
18e60 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
18e70 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68  .          ** th
18e80 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f  at we do not. */
18e90 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
18ea0 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41  t( pPg->pgno!=PA
18eb0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
18ec0 65 72 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20  er) );.         
18ed0 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
18ee0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
18ef0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
18f00 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
18f10 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  um(pPager, pPg->
18f20 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20  pgno, pData);.  
18f30 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20          saved = 
18f40 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
18f50 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
18f60 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  r);.          st
18f70 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c  ore32bits(cksum,
18f80 20 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61   pPg, pPager->pa
18f90 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
18fa0 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
18fb0 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
18fc0 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
18fd0 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
18fe0 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20  Pg, -4);.       
18ff0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
19000 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
19010 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61  fd, &((char*)pDa
19020 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a  ta)[-4], szPg);.
19030 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
19040 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
19050 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20  szPg;.          
19060 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20  TRACE4("JOURNAL 
19070 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
19080 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
190a0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
190b0 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
190c0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20  edSync);.       
190d0 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
190e0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
190f0 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  o, 0);.         
19100 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
19110 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
19120 65 72 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20  er) = saved;.   
19130 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
19140 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19150 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
19160 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
19170 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
19180 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
19190 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
191a0 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  FULL;.          
191b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
191c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
191d0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b     pPager->nRec+
191e0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  +;.          ass
191f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
19200 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20  Journal!=0 );.  
19210 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
19220 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
19230 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
19240 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
19250 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
19260 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
19270 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
19280 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19290 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
192a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
192b0 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
192c0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
192d0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
192e0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
192f0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
19300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
19310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
19320 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d  se{.        pPg-
19330 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61  >needSync = !pPa
19340 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
19350 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
19360 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20  noSync;.        
19370 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20 25  TRACE4("APPEND %
19380 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79  d page %d needSy
19390 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  nc=%d\n",.      
193a0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
193b0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
193c0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
193d0 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ync);.      }.  
193e0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
193f0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  dSync ){.       
19400 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
19410 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
19420 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
19430 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nal = 1;.    }. 
19440 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20   .    /* If the 
19450 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
19460 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68  l is open and th
19470 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
19480 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e   it,.    ** then
19490 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65   write the curre
194a0 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20 73  nt page to the s
194b0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
194c0 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20  .  Note that.   
194d0 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e   ** the statemen
194e0 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  t journal format
194f0 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68   differs from th
19500 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e  e standard journ
19510 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a  al format.    **
19520 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74   in that it omit
19530 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20  s the checksums 
19540 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a  and the header..
19550 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
19560 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
19570 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74   && !pPg->inStmt
19580 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
19590 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
195a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73  Size ){.      as
195b0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
195c0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
195d0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
195e0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
195f0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
19600 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
19610 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
19620 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
19630 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61  ager);.        a
19640 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53  ssert( pHist->pS
19650 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt==0 );.      
19660 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
19670 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
19680 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
19690 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ze );.        if
196a0 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29  ( pHist->pStmt )
196b0 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
196c0 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c  py(pHist->pStmt,
196d0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
196e0 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
196f0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
19700 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  }.        TRACE3
19710 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
19720 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
19730 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
19740 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
19750 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
19760 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d  store32bits(pPg-
19770 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b  >pgno, pPg, -4);
19780 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
19790 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
197a0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
197b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
197c0 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
197d0 3e 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44  >stfd,((char*)pD
197e0 61 74 61 29 2d 34 2c 0a 20 20 20 20 20 20 20 20  ata)-4,.        
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19800 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
19810 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
19820 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
19830 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
19840 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19850 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
19860 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  no);.        COD
19870 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
19880 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
19890 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
198a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
198b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
198c0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
198d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
198e0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
198f0 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
19900 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
19910 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
19920 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
19930 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
19940 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
19950 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
19960 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
19970 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
19980 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
19990 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
199a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
199b0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
199c0 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
199d0 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
199e0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
199f0 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
19a00 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
19a10 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
19a20 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
19a30 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
19a40 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
19a50 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
19a60 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
19a70 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
19a80 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
19a90 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
19aa0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
19ab0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19ac0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
19ad0 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
19ae0 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
19af0 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
19b00 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
19b10 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
19b20 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
19b30 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
19b40 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
19b50 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
19b60 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
19b70 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
19b80 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
19b90 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
19ba0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
19bb0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
19bc0 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
19bd0 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23  pPg->dirty;.}..#
19be0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
19bf0 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
19c00 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
19c10 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
19c20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
19c30 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
19c40 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
19c50 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
19c60 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74  e3pager_overwrit
19c70 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
19c80 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
19c90 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64   *pData){.  void
19ca0 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72   *pPage;.  int r
19cb0 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
19cc0 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
19cd0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  er, pgno, &pPage
19ce0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
19cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
19d00 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
19d10 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
19d20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19d30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
19d40 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61  cpy(pPage, pData
19d50 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
19d60 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
19d70 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
19d80 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  f(pPage);.  }.  
19d90 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
19da0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
19db0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
19dc0 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
19dd0 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
19de0 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
19df0 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
19e00 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22  mation on page "
19e10 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68  pgno" back to th
19e20 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
19e30 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
19e40 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
19e50 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
19e60 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
19e70 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
19e80 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
19e90 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
19ea0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
19eb0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
19ec0 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
19ed0 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
19ee0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
19ef0 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
19f00 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
19f10 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
19f20 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
19f30 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
19f40 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
19f50 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
19f60 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
19f70 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
19f80 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
19f90 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
19fa0 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
19fb0 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
19fc0 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
19fd0 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
19fe0 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
19ff0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
1a000 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
1a010 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
1a020 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
1a030 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
1a040 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
1a050 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
1a060 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
1a070 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
1a080 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
1a090 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
1a0a0 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
1a0b0 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
1a0c0 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
1a0d0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
1a0e0 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
1a0f0 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
1a100 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
1a110 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
1a120 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
1a130 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
1a140 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
1a150 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
1a160 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
1a170 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
1a180 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
1a190 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
1a1a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a1b0 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
1a1c0 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f  eused,.** the do
1a1d0 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  nt_rollback() ro
1a1e0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1a1f0 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
1a200 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a  e page contains.
1a210 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ** critical data
1a220 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
1a230 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
1a240 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ts rolled back i
1a250 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68  n spite.** of th
1a260 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
1a270 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
1a280 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
1a290 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  t_write(Pager *p
1a2a0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
1a2b0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1a2c0 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
1a2d0 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d  return;..  pPg =
1a2e0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1a2f0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
1a300 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
1a310 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
1a320 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
1a330 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  && !pPager->stmt
1a340 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 69 66 28  InUse ){.    if(
1a350 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1a360 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20  =(int)pPg->pgno 
1a370 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  && pPager->origD
1a380 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62  bSize<pPager->db
1a390 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
1a3a0 20 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69   If this pages i
1a3b0 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  s the last page 
1a3c0 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  in the file and 
1a3d0 74 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f  the file has gro
1a3e0 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69  wn.      ** duri
1a3f0 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  ng the current t
1a400 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e  ransaction, then
1a410 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65   do NOT mark the
1a420 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a   page as clean..
1a430 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68        ** When th
1a440 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a450 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d  grows, we must m
1a460 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1a470 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20  e last page.    
1a480 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65    ** gets writte
1a490 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  n at least once 
1a4a0 73 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b  so that the disk
1a4b0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68   file will be th
1a4c0 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20  e correct.      
1a4d0 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20  ** size. If you 
1a4e0 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69  do not write thi
1a4f0 73 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73  s page and the s
1a500 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a  ize of the file.
1a510 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20        ** on the 
1a520 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69  disk ends up bei
1a530 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68  ng too small, th
1a540 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64  at can lead to d
1a550 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
1a560 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69   corruption duri
1a570 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e  ng the next tran
1a580 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
1a590 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
1a5a0 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f     TRACE3("DONT_
1a5b0 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f 66  WRITE page %d of
1a5c0 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41   %d\n", pgno, PA
1a5d0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
1a5e0 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
1a5f0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1a600 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
1a610 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
1a620 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
1a630 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
1a640 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  f.    }.  }.}../
1a650 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
1a660 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
1a670 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
1a680 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
1a690 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
1a6a0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1a6b0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
1a6c0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
1a6d0 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
1a6e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
1a6f0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
1a700 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
1a710 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
1a720 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
1a730 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  rnal..*/.void sq
1a740 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f  lite3pager_dont_
1a750 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  rollback(void *p
1a760 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
1a770 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
1a780 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
1a790 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1a7a0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66  g->pPager;..  if
1a7b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1a7c0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
1a7d0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1a7e0 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74  nalOpen==0 ) ret
1a7f0 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  urn;.  if( pPg->
1a800 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c  alwaysRollback |
1a810 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73  | pPager->always
1a820 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44  Rollback || MEMD
1a830 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  B ) return;.  if
1a840 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
1a850 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
1a860 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
1a870 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
1a880 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a890 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
1a8a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
1a8b0 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
1a8c0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
1a8d0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70  ->pgno&7);.    p
1a8e0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
1a8f0 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  1;.    if( pPage
1a900 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1a910 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1a920 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f  nStmt[pPg->pgno/
1a930 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
1a940 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61  gno&7);.      pa
1a950 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
1a960 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
1a970 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54      TRACE3("DONT
1a980 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25  _ROLLBACK page %
1a990 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1a9a0 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1a9b0 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69  Pager));.  }.  i
1a9c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1a9d0 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e  nUse && !pPg->in
1a9e0 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67  Stmt && (int)pPg
1a9f0 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e  ->pgno<=pPager->
1aa00 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20  stmtSize ){.    
1aa10 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1aa20 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
1aa30 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
1aa40 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
1aa50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1aa60 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
1aa70 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
1aa80 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
1aa90 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
1aaa0 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f  no&7);.    page_
1aab0 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
1aac0 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23  (pPg);.  }.}...#
1aad0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1aae0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
1aaf0 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
1ab00 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
1ab10 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
1ab20 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
1ab30 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
1ab40 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72  eFree(pHist->pOr
1ab50 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ig);.  sqliteFre
1ab60 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
1ab70 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  .  pHist->pOrig 
1ab80 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53  = 0;.  pHist->pS
1ab90 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65  tmt = 0;.}.#else
1aba0 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69  .#define clearHi
1abb0 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a  story(x).#endif.
1abc0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c  ./*.** Commit al
1abd0 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  l changes to the
1abe0 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65   database and re
1abf0 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20  lease the write 
1ac00 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  lock..**.** If t
1ac10 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20  he commit fails 
1ac20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20  for any reason, 
1ac30 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d  a rollback attem
1ac40 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e  pt is made.** an
1ac50 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
1ac60 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66  is returned.  If
1ac70 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b   the commit work
1ac80 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  ed, SQLITE_OK.**
1ac90 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1aca0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1acb0 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  r_commit(Pager *
1acc0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1acd0 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
1ace0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
1acf0 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45  errMask==PAGER_E
1ad00 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72  RR_FULL ){.    r
1ad10 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1ad20 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
1ad30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1ad40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1ad50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55    rc = SQLITE_FU
1ad60 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  LL;.    }.    re
1ad70 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
1ad80 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
1ad90 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
1ada0 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
1adb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
1adc0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
1add0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
1ade0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
1adf0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ae00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
1ae10 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20   TRACE2("COMMIT 
1ae20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1ae30 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
1ae40 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20  EMDB ){.    pPg 
1ae50 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f  = pager_get_all_
1ae60 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67  dirty_pages(pPag
1ae70 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  er);.    while( 
1ae80 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65  pPg ){.      cle
1ae90 61 72 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f  arHistory(PGHDR_
1aea0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
1aeb0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
1aec0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1aed0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1aee0 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
1aef0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
1af00 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
1af10 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
1af20 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
1af30 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79  Pg = pPg->pDirty
1af40 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
1af50 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
1af60 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1af70 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1af80 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
1af90 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
1afa0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
1afb0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
1afc0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
1afd0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1afe0 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
1aff0 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
1b000 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
1b010 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
1b020 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
1b030 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1b040 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
1b050 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
1b060 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74  _SHARED;.    ret
1b070 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b080 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1b090 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29  >dirtyCache==0 )
1b0a0 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61  {.    /* Exit ea
1b0b0 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69  rly (without doi
1b0c0 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73  ng the time-cons
1b0d0 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53  uming sqlite3OsS
1b0e0 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20  ync() calls).   
1b0f0 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68 61 76   ** if there hav
1b100 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65  e been no change
1b110 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1b120 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  e file. */.    a
1b130 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1b140 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
1b150 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
1b160 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
1b170 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
1b180 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
1b190 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
1b1a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b1b0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1b1c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1b1d0 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20  er_sync(pPager, 
1b1e0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
1b1f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b200 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62    goto commit_ab
1b210 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ort;.  }.  rc = 
1b220 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
1b230 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  k(pPager);.  pPa
1b240 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1b250 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  ;.  return rc;..
1b260 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1b270 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
1b280 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65  wrong during the
1b290 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
1b2a0 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f  .  */.commit_abo
1b2b0 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70 61 67  rt:.  sqlite3pag
1b2c0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
1b2d0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
1b2e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
1b2f0 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e  ack all changes.
1b300 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66    The database f
1b310 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
1b320 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
1b330 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79  ** All in-memory
1b340 20 63 61 63 68 65 20 70 61 67 65 73 20 72 65 76   cache pages rev
1b350 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69  ert to their ori
1b360 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65  ginal data conte
1b370 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  nts..** The jour
1b380 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  nal is deleted..
1b390 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b3a0 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75  ne cannot fail u
1b3b0 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1b3c0 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
1b3d0 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65  following.** the
1b3e0 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67   correct locking
1b3f0 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54   protocol (SQLIT
1b400 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75  E_PROTOCOL) or u
1b410 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72  nless some other
1b420 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77  .** process is w
1b430 72 69 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74  riting trash int
1b440 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1b450 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  le (SQLITE_CORRU
1b460 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73  PT) or.** unless
1b470 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28   a prior malloc(
1b480 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45  ) failed (SQLITE
1b490 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70  _NOMEM).  Approp
1b4a0 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  riate error.** c
1b4b0 6f 64 65 73 20 61 72 65 20 72 65 74 75 72 6e 65  odes are returne
1b4c0 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20  d for all these 
1b4d0 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65  occasions.  Othe
1b4e0 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45  rwise,.** SQLITE
1b4f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1b500 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1b510 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61  ager_rollback(Pa
1b520 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b530 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32  int rc;.  TRACE2
1b540 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
1b550 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b560 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1b570 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
1b580 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65  .    for(p=pPage
1b590 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d  r->pAll; p; p=p-
1b5a0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
1b5b0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1b5c0 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
1b5d0 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ( !p->alwaysRoll
1b5e0 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66  back );.      if
1b5f0 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  ( !p->dirty ){. 
1b600 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
1b610 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
1b620 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b630 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29  Pager))->pOrig )
1b640 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
1b650 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
1b660 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
1b670 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d  , pPager))->pStm
1b680 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  t );.        con
1b690 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a  tinue;.      }..
1b6a0 20 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47        pHist = PG
1b6b0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
1b6c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1b6d0 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29  ( pHist->pOrig )
1b6e0 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
1b6f0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
1b700 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  ), pHist->pOrig,
1b710 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1b720 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  e);.        TRAC
1b730 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
1b740 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
1b750 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
1b760 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
1b770 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54  }else{.        T
1b780 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
1b790 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
1b7a0 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
1b7b0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
1b7c0 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
1b7d0 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
1b7e0 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
1b7f0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
1b800 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
1b810 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b    p->inStmt = 0;
1b820 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53  .      p->pPrevS
1b830 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74  tmt = p->pNextSt
1b840 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69  mt = 0;..      i
1b850 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
1b860 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
1b870 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
1b880 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  r(PGHDR_TO_DATA(
1b890 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  p), pPager->page
1b8a0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
1b8b0 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20       .    }.    
1b8c0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
1b8d0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  0;.    pPager->d
1b8e0 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
1b8f0 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20  origDbSize;.    
1b900 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70  memoryTruncate(p
1b910 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
1b920 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1b930 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
1b940 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1b950 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
1b960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1b970 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64    if( !pPager->d
1b980 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50  irtyCache || !pP
1b990 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1b9a0 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  n ){.    rc = pa
1b9b0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
1b9c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
1b9d0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
1b9e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1b9f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67  .  }..  if( pPag
1ba00 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26  er->errMask!=0 &
1ba10 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  & pPager->errMas
1ba20 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k!=PAGER_ERR_FUL
1ba30 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
1ba40 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1ba50 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
1ba60 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
1ba70 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
1ba80 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61   }.    return pa
1ba90 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
1baa0 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  er);.  }.  if( p
1bab0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1bac0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
1bad0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
1bae0 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f   rc = pager_relo
1baf0 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
1bb00 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
1bb10 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
1bb20 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
1bb30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1bb40 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
1bb50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1bb60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
1bb70 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
1bb80 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
1bb90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1bba0 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
1bbb0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 70 50 61  PT_BKPT;.    pPa
1bbc0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
1bbd0 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
1bbe0 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
1bbf0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
1bc00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1bc10 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
1bc20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
1bc30 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
1bc40 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
1bc50 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
1bc60 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
1bc70 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
1bc80 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
1bc90 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
1bca0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
1bcb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1bcc0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
1bcd0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1bce0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
1bcf0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
1bd00 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
1bd10 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
1bd20 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
1bd30 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
1bd40 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
1bd50 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
1bd60 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
1bd70 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
1bd80 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
1bd90 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
1bda0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
1bdb0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
1bdc0 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
1bdd0 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 23 69 66  er->errMask;.#if
1bde0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1bdf0 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d    a[6] = pPager-
1be00 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20  >nHit;.  a[7] = 
1be10 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20  pPager->nMiss;. 
1be20 20 61 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[8] = pPager->
1be30 6e 4f 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20  nOvfl;.  a[9] = 
1be40 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
1be50 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
1be60 3e 6e 57 72 69 74 65 3b 0a 23 65 6e 64 69 66 0a  >nWrite;.#endif.
1be70 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
1be80 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
1be90 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
1bea0 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
1beb0 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1bec0 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
1bed0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
1bee0 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
1bef0 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
1bf00 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
1bf10 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
1bf20 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
1bf30 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
1bf40 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
1bf50 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
1bf60 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
1bf70 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
1bf80 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1bf90 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
1bfa0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
1bfb0 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
1bfc0 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
1bfd0 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
1bfe0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
1bff0 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
1c000 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
1c010 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  =0 );.  TRACE2("
1c020 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
1c030 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1c040 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
1c050 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
1c060 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
1c070 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
1c080 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
1c090 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
1c0a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1c0b0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
1c0c0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
1c0d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
1c0e0 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
1c0f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c100 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1c110 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1c120 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
1c130 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
1c140 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
1c150 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
1c160 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
1c170 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
1c180 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  /* sqlite3OsLock
1c190 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
1c1a0 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20  RED_LOCK); */.  
1c1b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c1c0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64  NOMEM;.  }.#ifnd
1c1d0 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d  ef NDEBUG.  rc =
1c1e0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
1c1f0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
1c200 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69  &pPager->stmtJSi
1c210 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
1c220 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
1c230 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74  failed;.  assert
1c240 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  ( pPager->stmtJS
1c250 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a  ize == pPager->j
1c260 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e  ournalOff );.#en
1c270 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  dif.  pPager->st
1c280 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72  mtJSize = pPager
1c290 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
1c2a0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1c2b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
1c2c0 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  e;.  pPager->stm
1c2d0 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70  tHdrOff = 0;.  p
1c2e0 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d  Pager->stmtCksum
1c2f0 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d   = pPager->cksum
1c300 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61  Init;.  if( !pPa
1c310 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b  ger->stmtOpen ){
1c320 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c330 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
1c340 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e  zTemp, &pPager->
1c350 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  stfd);.    if( r
1c360 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65  c ) goto stmt_be
1c370 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  gin_failed;.    
1c380 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1c390 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
1c3a0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1c3b0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
1c3c0 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72  mtInUse = 1;.  r
1c3d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1c3e0 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  . .stmt_begin_fa
1c3f0 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67  iled:.  if( pPag
1c400 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20  er->aInStmt ){. 
1c410 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
1c420 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
1c430 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
1c440 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
1c450 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c460 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74  ** Commit a stat
1c470 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ement..*/.int sq
1c480 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1c490 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
1c4a0 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
1c4b0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
1c4c0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
1c4d0 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52  , *pNext;.    TR
1c4e0 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
1c4f0 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
1c500 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
1c510 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
1c520 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
1c530 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
1c540 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
1c550 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
1c560 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
1c570 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
1c580 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
1c590 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1c5a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1c5b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1c5c0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1c5d0 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
1c5e0 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
1c5f0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1c600 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1c610 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a   pPg->inStmt );.
1c620 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
1c630 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
1c640 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
1c650 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
1c660 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
1c670 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
1c680 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1c690 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1c6a0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1c6b0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1c6c0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1c6d0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1c6e0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
1c6f0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1c700 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1c710 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1c720 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
1c730 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1c740 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1c750 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1c760 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1c770 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1c780 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
1c790 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1c7a0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f  te3pager_stmt_ro
1c7b0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
1c7c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1c7d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1c7e0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1c7f0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
1c800 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
1c810 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c820 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1c830 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
1c840 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
1c850 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
1c860 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1c870 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
1c880 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1c890 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1c8a0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1c8b0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1c8c0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
1c8d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
1c8e0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1c8f0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
1c900 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1c910 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1c920 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1c930 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
1c940 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1c950 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c960 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1c970 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1c980 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
1c990 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
1c9a0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1c9b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c9c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c9d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
1c9e0 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
1c9f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1ca00 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1ca10 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
1ca20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1ca30 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1ca40 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
1ca50 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
1ca60 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ca70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1ca80 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1ca90 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1caa0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1cab0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69  *sqlite3pager_fi
1cac0 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
1cad0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1cae0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1caf0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1cb00 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
1cb10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1cb20 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1cb30 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1cb40 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72  er_dirname(Pager
1cb50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1cb60 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
1cb70 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
1cb80 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
1cb90 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
1cba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1cbb0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1cbc0 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e  lite3pager_journ
1cbd0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
1cbe0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1cbf0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1cc00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1cc10 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
1cc20 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
1cc30 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
1cc40 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
1cc50 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
1cc60 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
1cc70 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
1cc80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6e 6f 73  sqlite3pager_nos
1cc90 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
1cca0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
1ccb0 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a  ger->noSync;.}..
1ccc0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
1ccd0 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
1cce0 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
1ccf0 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65  e3pager_set_code
1cd00 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
1cd10 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  er,.  void (*xCo
1cd20 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
1cd30 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
1cd40 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
1cd50 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
1cd60 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
1cd70 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
1cd80 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a  = pCodecArg;.}..
1cd90 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1cda0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1cdb0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1cdc0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1cdd0 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1cde0 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1cdf0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1ce00 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ce10 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1ce20 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1ce30 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69   *pPager){.  voi
1ce40 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64  d *pPage;.  PgHd
1ce50 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
1ce60 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1ce70 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1ce80 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1ce90 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1cea0 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
1ceb0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1cec0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
1ced0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1cee0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1cef0 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
1cf00 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1cf10 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1cf20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1cf30 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52  turn rc;..  /* R
1cf40 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ead the current 
1cf50 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34  value at byte 24
1cf60 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20  . */.  pPgHdr = 
1cf70 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50  DATA_TO_PGHDR(pP
1cf80 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63  age);.  change_c
1cf90 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76  ounter = retriev
1cfa0 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20  e32bits(pPgHdr, 
1cfb0 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  24);..  /* Incre
1cfc0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1cfd0 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1cfe0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1cff0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1d000 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
1d010 73 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e  store32bits(chan
1d020 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48  ge_counter, pPgH
1d030 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52  dr, 24);..  /* R
1d040 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
1d050 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
1d060 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1d070 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ef(pPage);.  ret
1d080 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1d090 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1d0a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1d0b0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
1d0c0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1d0d0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1d0e0 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1d0f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1d100 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1d110 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1d120 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1d130 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1d140 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1d150 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1d160 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1d170 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1d180 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1d190 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1d1a0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1d1b0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1d1c0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1d1d0 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1d1e0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1d1f0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1d200 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1d210 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1d220 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1d230 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1d240 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1d250 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1d260 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1d270 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1d280 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d290 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1d2a0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1d2b0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1d2c0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1d2d0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1d2e0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1d2f0 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1d300 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20  te3pager_sync() 
1d310 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
1d320 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
1d330 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1d340 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1d350 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
1d360 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
1d370 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
1d380 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1d390 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
1d3a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1d3b0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1d3c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1d3d0 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
1d3e0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1d3f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52  SQLITE_OK;..  TR
1d400 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
1d410 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
1d420 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
1d430 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
1d440 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1d450 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
1d460 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1d470 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1d480 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
1d490 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1d4a0 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
1d4b0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
1d4c0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1d4d0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1d4e0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1d4f0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1d500 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
1d510 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1d520 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
1d530 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1d540 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d550 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1d560 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61  ..    /* If a ma
1d570 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1d580 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
1d590 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1d5a0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  to the.    ** jo
1d5b0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
1d5c0 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75   no sync is requ
1d5d0 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65  ired. This happe
1d5e0 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ns when it is.  
1d5f0 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68    ** written, th
1d600 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66  en the process f
1d610 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20  ails to upgrade 
1d620 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
1d630 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  to an.    ** EXC
1d640 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
1d650 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70   next time the p
1d660 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20  rocess tries to 
1d670 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a  commit the.    *
1d680 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
1d690 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20  e m-j name will 
1d6a0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1d6b0 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  n written..    *
1d6c0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1d6d0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a  r->setMaster ){.
1d6e0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1d6f0 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1d700 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
1d710 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d720 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d730 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
1d740 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1d750 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
1d760 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1d770 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1d780 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1d790 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
1d7a0 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
1d7b0 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
1d7c0 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
1d7d0 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
1d7e0 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
1d7f0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1d800 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1d810 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1d820 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1d830 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a  ;.        void *
1d840 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  pPage;.        i
1d850 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
1d860 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1d870 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
1d880 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
1d890 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
1d8a0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
1d8b0 20 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d     if( !(pPager-
1d8c0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d  >aInJournal[i/8]
1d8d0 20 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 26   & (1<<(i&7))) &
1d8e0 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20  & i!=iSkip ){.  
1d8f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1d900 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1d910 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
1d920 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
1d930 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d940 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1d950 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  it;.            
1d960 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1d970 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1d980 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1d990 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1d9a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1d9b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d9c0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1d9d0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1d9e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20   }.        } .  
1d9f0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
1da00 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73     rc = writeMas
1da10 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
1da20 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  r, zMaster);.   
1da30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1da40 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1da50 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20  _exit;.      rc 
1da60 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
1da70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1da80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1da90 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1daa0 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
1dab0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1dac0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e  VACUUM.    if( n
1dad0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
1dae0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1daf0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
1db00 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20  ger, nTrunc);.  
1db10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1db20 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1db30 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65  c_exit;.    }.#e
1db40 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69  ndif..    /* Wri
1db50 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  te all dirty pag
1db60 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
1db70 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70  se file */.    p
1db80 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61  Pg = pager_get_a
1db90 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70  ll_dirty_pages(p
1dba0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
1dbb0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
1dbc0 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  elist(pPg);.    
1dbd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1dbe0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1dbf0 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63  it;..    /* Sync
1dc00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1dc10 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21  le. */.    if( !
1dc20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
1dc30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1dc40 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
1dc50 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d  r->fd, 0);.    }
1dc60 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1dc70 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1dc80 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  ED;.  }..sync_ex
1dc90 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1dca0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1dcb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1dcc0 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
1dcd0 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
1dce0 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f  d by pData to lo
1dcf0 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
1dd00 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  he file. .**.** 
1dd10 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
1dd20 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1dd30 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1dd40 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74  pgno. If current
1dd50 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73   page.** pgno is
1dd60 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
1dd70 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1dd80 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
1dd90 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79  written there by
1dda0 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74  .** by this rout
1ddb0 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70  ine. The same ap
1ddc0 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67  plies to the pag
1ddd0 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74  e pData refers t
1dde0 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  o on entry to.**
1ddf0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1de00 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
1de10 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65  to the page refe
1de20 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20  red to by pData 
1de30 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
1de40 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
1de50 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
1de60 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61  ed with page pDa
1de70 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  ta (i.e. data st
1de80 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
1de90 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
1dea0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
1deb0 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
1dec0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1ded0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
1dee0 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
1def0 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
1df00 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
1df10 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
1df20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
1df30 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
1df40 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
1df50 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
1df60 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
1df70 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
1df80 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
1df90 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
1dfa0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
1dfb0 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
1dfc0 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
1dfd0 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
1dfe0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1dff0 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65  er_movepage(Page
1e000 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
1e010 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e  *pData, Pgno pgn
1e020 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1e030 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
1e040 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72  (pData);.  PgHdr
1e050 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74   *pPgOld; .  int
1e060 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53   h;.  Pgno needS
1e070 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20  yncPgno = 0;..  
1e080 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1e090 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35  f>0 );..  TRACE5
1e0a0 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
1e0b0 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
1e0c0 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
1e0d0 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
1e0e0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1e0f0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
1e100 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20  , pgno);..  if( 
1e110 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
1e120 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e  .    needSyncPgn
1e130 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20  o = pPg->pgno;. 
1e140 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1e150 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
1e160 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
1e170 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72  rty );.    asser
1e180 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1e190 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ync );.  }..  /*
1e1a0 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d   Unlink pPg from
1e1b0 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e   it's hash-chain
1e1c0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68   */.  unlinkHash
1e1d0 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
1e1e0 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  g);..  /* If the
1e1f0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20   cache contains 
1e200 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65  a page with page
1e210 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65  -number pgno, re
1e220 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f  move it.  ** fro
1e230 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
1e240 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
1e250 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
1e260 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
1e270 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
1e280 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
1e290 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
1e2a0 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
1e2b0 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
1e2c0 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
1e2d0 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20    */.  pPgOld = 
1e2e0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1e2f0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1e300 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20  ( pPgOld ){.    
1e310 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
1e320 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75  nRef==0 );.    u
1e330 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1e340 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a  Pager, pPgOld);.
1e350 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74      pPgOld->dirt
1e360 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
1e370 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20  PgOld->needSync 
1e380 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1e390 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e   pPgOld->inJourn
1e3a0 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  al );.      pPg-
1e3b0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
1e3c0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
1e3d0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61  ync = 1;.      a
1e3e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1e3f0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d  eedSync );.    }
1e400 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67  .  }..  /* Chang
1e410 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  e the page numbe
1e420 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e  r for pPg and in
1e430 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
1e440 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e   new hash-chain.
1e450 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20   */.  pPg->pgno 
1e460 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61  = pgno;.  h = pa
1e470 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a  ger_hash(pgno);.
1e480 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
1e490 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
1e4a0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
1e4b0 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
1e4c0 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
1e4d0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1e4e0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
1e4f0 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
1e500 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
1e510 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
1e520 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
1e530 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
1e540 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e  sh = 0;..  pPg->
1e550 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50 61  dirty = 1;.  pPa
1e560 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1e570 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
1e580 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
1e590 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
1e5a0 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
1e5b0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e5c0 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
1e5d0 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
1e5e0 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
1e5f0 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1e600 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
1e610 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
1e620 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
1e630 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
1e640 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
1e650 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
1e660 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
1e670 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
1e680 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
1e690 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
1e6a0 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
1e6b0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
1e6c0 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
1e6d0 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
1e6e0 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1e6f0 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
1e700 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
1e710 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
1e720 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20   call may cause 
1e730 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
1e740 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20  ync. So make.   
1e750 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67   ** sure the Pag
1e760 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
1e770 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20   is set too..   
1e780 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   */.    int rc;.
1e790 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53      void *pNeedS
1e7a0 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ync;.    assert(
1e7b0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
1e7c0 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  c );.    rc = sq
1e7d0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1e7e0 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50  Pager, needSyncP
1e7f0 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29  gno, &pNeedSync)
1e800 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1e810 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
1e820 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
1e830 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1e840 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52     DATA_TO_PGHDR
1e850 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65  (pNeedSync)->nee
1e860 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1e870 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1e880 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e  edSync)->inJourn
1e890 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  al = 1;.    DATA
1e8a0 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1e8b0 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31 3b  ync)->dirty = 1;
1e8c0 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
1e8d0 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e  r_unref(pNeedSyn
1e8e0 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  c);.  }..  retur
1e8f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
1e900 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1e910 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
1e920 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
1e930 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
1e940 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
1e950 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66  t state of the f
1e960 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65  ile lock for the
1e970 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
1e980 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1e990 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c  e is one of NO_L
1e9a0 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  OCK, SHARED_LOCK
1e9b0 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c  , RESERVED_LOCK,
1e9c0 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  .** PENDING_LOCK
1e9d0 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c  , or EXCLUSIVE_L
1e9e0 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  OCK..*/.int sqli
1e9f0 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61  te3pager_locksta
1ea00 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
1ea10 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1ea20 74 65 33 4f 73 4c 6f 63 6b 53 74 61 74 65 28 70  te3OsLockState(p
1ea30 50 61 67 65 72 2d 3e 66 64 29 3b 0a 7d 0a 23 65  Pager->fd);.}.#e
1ea40 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1ea50 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1ea60 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
1ea70 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
1ea80 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
1ea90 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
1eaa0 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1eab0 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20  r_refdump(Pager 
1eac0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
1ead0 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
1eae0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
1eaf0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1eb00 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
1eb10 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
1eb20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
1eb30 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1eb40 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
1eb50 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  %p nRef=%d\n", .
1eb60 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
1eb70 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1eb80 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
1eb90 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
1eba0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
1ebb0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a  _OMIT_DISKIO */.