/ Hex Artifact Content
Login

Artifact ca23cdff9e67a8e826e4796c60f06db6aab69b72:


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 31  : pager.c,v 1.21
0350: 37 20 32 30 30 35 2f 31 31 2f 30 35 20 31 35 3a  7 2005/11/05 15:
0360: 31 31 3a 32 33 20 64 72 68 20 45 78 70 20 24 0a  11:23 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 54 68 65 79 20 61 72 65 20 72 65 71  rs. They are req
0620: 75 69 72 65 64 20 73 6f 20 74 68 61 74 20 74 72  uired so that tr
0630: 61 63 69 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20  acing.** can be 
0640: 74 75 72 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75  turned on when u
0650: 73 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65  sing both the re
0660: 67 75 6c 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20  gular os_unix.c 
0670: 61 6e 64 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a  and os_test.c.**
0680: 20 62 61 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a   backends..**.**
0690: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
06a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
06b0: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
06c0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
06d0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06e0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
0700: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
0710: 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20  es an OsFile.** 
0720: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0730: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64  rgument..*/.#ifd
0740: 65 66 20 4f 53 5f 54 45 53 54 0a 23 64 65 66 69  ef OS_TEST.#defi
0750: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 70  ne PAGERID(p) (p
0760: 2d 3e 66 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66  ->fd->fd.h).#def
0770: 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  ine FILEHANDLEID
0780: 28 66 64 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a  (fd) (fd->fd.h).
0790: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
07a0: 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66 64 2e  GERID(p) (p->fd.
07b0: 68 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48  h).#define FILEH
07c0: 41 4e 44 4c 45 49 44 28 66 64 29 20 28 66 64 2e  ANDLEID(fd) (fd.
07d0: 68 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  h).#endif../*.**
07e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0800: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0820: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0830: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0840: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0850: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0860: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0870: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0880: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
08a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
08b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
08d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
08e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
08f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0910: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0920: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0930: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0940: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0950: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0980: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0990: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
09c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
09d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
09e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0a00: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0a10: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0a20: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0a30: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0a40: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0a50: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0a80: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0a90: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
0aa0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
0ad0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
0ae0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
0af0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0b10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0b20: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0b30: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0b60: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0b70: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
0bb0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0bc0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0bd0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
0be0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0c10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0c20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0c30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0c40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0c50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0c60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0c70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0c90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0ca0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0cb0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0cc0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0cd0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ce0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0cf0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0d00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0d10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0d20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0d30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0d60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0d70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0d80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0da0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0db0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0dc0: 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ove the.**      
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
0df0: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
0e00: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20  n will be.**    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a     committed..**
0e30: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0e40: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0e50: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0e60: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0e70: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  * sqlite3pager_g
0e80: 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65  et() occurs, the
0e90: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ea0: 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ns to PAGER_SHAR
0eb0: 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  ED..** After all
0ec0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0ed0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
0ee0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65  sqlite_page_unre
0ef0: 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74  f(),.** the stat
0f00: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61  e transitions ba
0f10: 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f  ck to PAGER_UNLO
0f20: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0f30: 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69  ime.** that sqli
0f40: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
0f50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0f60: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0f70: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f80: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f90: 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  hat sqlite_page_
0fa0: 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  write() can only
0fb0: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0fc0: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0fd0: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0fe0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0ff0: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
1000: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
1010: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
1020: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
1030: 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ED.).** The tran
1040: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
1050: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
1060: 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e 79   when before any
1070: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1080: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1090: 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74 65  base file.  Afte
10a0: 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  r an sqlite3page
10b0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  r_rollback().** 
10c0: 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72 5f  or sqlite_pager_
10d0: 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73 74  commit(), the st
10e0: 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74 6f  ate goes back to
10f0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
1100: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1110: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
1120: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52  efine PAGER_SHAR
1130: 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73  ED      1   /* s
1140: 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f  ame as SHARED_LO
1150: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1160: 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20  GER_RESERVED    
1170: 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52  2   /* same as R
1180: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a  ESERVED_LOCK */.
1190: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58  #define PAGER_EX
11a0: 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a  CLUSIVE   4   /*
11b0: 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49   same as EXCLUSI
11c0: 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  VE_LOCK */.#defi
11d0: 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  ne PAGER_SYNCED 
11e0: 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66       5../*.** If
11f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
1200: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d  _RESERVED_LOCK m
1210: 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74  acro is set to t
1220: 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  rue at compile-t
1230: 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69  ime,.** then fai
1240: 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20  led attempts to 
1250: 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  get a reserved l
1260: 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  ock will invoke 
1270: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1280: 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66  k..** This is of
1290: 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54  f by default.  T
12a0: 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69  o see why, consi
12b0: 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
12c0: 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a  g scenario:.** .
12d0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65 61  ** Suppose threa
12e0: 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  d A already has 
12f0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
1300: 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72 76  d wants a reserv
1310: 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65  ed lock..** Thre
1320: 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61 73  ad B already has
1330: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1340: 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78   and wants an ex
1350: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
1360: 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64  f.** both thread
1370: 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 69  s are using thei
1380: 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73  r busy callbacks
1390: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  , it might be a 
13a0: 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20  long time.** be 
13b0: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  for one of the t
13c0: 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20 61  hreads give up a
13d0: 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74  nd allows the ot
13e0: 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a  her to proceed..
13f0: 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 68  ** But if the th
1400: 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67  read trying to g
1410: 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64 20  et the reserved 
1420: 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71 75  lock gives up qu
1430: 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20  ickly.** (if it 
1440: 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74  never invokes it
1450: 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29  s busy callback)
1460: 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1470: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  tion will be.** 
1480: 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79  resolved quickly
1490: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
14a0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14b0: 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  D_LOCK.# define 
14c0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
14d0: 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64  RVED_LOCK 0.#end
14e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  if../*.** This m
14f0: 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75  acro rounds valu
1500: 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69 66  es up so that if
1510: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
1520: 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69   address it.** i
1530: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1540: 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74 68  be an address th
1550: 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f  at is aligned to
1560: 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
1570: 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ary..*/.#define 
1580: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
1590: 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37  X)   (((X)+7)&~7
15a0: 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  )../*.** Each in
15b0: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
15c0: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
15d0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
15e0: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
15f0: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1600: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1610: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1620: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1630: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1640: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1650: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1660: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1670: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1680: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1690: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
16a0: 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69  () on a page pri
16b0: 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20  or to making.** 
16c0: 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  any modification
16d0: 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20  s to that page. 
16e0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
16f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1700: 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  te().** is calle
1710: 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  d, the original 
1720: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
1730: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1740: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1750: 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72  ournal and PgHdr
1760: 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  .inJournal and P
1770: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72  gHdr.needSync ar
1780: 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f  e set.  Later, o
1790: 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  nce.** the journ
17a0: 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64 65  al page has made
17b0: 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73   it onto the dis
17c0: 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64 72  k surface, PgHdr
17d0: 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20  .needSync.** is 
17e0: 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f  cleared.  The mo
17f0: 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e  dified page cann
1800: 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 61  ot be written ba
1810: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  ck into the orig
1820: 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  inal.** database
1830: 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
1840: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61  journal pages ha
1850: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
1860: 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a   disk and the.**
1870: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
1880: 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
1890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64  ..**.** The PgHd
18a0: 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73 20  r.dirty flag is 
18b0: 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33  set when sqlite3
18c0: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
18d0: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
18e0: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
18f0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1900: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1910: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1920: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1930: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
1940: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
1950: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
1960: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
1970: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1980: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1990: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
19a0: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
19b0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
19e0: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
19f0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a00: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a10: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a20: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1a30: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1a40: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1a50: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1a60: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1a70: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1a80: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1a90: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1ab0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1ac0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1ad0: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
1ae0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
1af0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
1b00: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
1b10: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
1b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b30: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
1b40: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1b50: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
1b60: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b80: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
1b90: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
1ba0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
1bb0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1bd0: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77   if we need to w
1be0: 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65  rite back change
1bf0: 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  s */.  u8 needSy
1c00: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1c10: 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f        /* Sync jo
1c20: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69  urnal before wri
1c30: 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a  ting this page *
1c40: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1c50: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1c60: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f     /* Disable do
1c70: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
1c80: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1c90: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
1cc0: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
1cd0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
1ce0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1cf0: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
1d00: 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67 48  es sorted by PgH
1d10: 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66 64 65  dr.pgno */.#ifde
1d20: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1d30: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
1d40: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
1d50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d60: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
1d70: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
1d80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
1d90: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
1da0: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
1db0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
1dc0: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
1dd0: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
1de0: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
1df0: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
1e00: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
1e10: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
1e20: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
1e30: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
1e40: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
1e50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
1e60: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
1e70: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1e80: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
1e90: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
1ea0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
1eb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1ec0: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
1ed0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1ee0: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
1ef0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
1f00: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
1f10: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
1f20: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
1f30: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
1f40: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
1f50: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
1f60: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
1f70: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
1f80: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
1f90: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
1fa0: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
1fb0: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
1fc0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1fd0: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
1fe0: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
1ff0: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
2000: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2010: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
2020: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
2030: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
2040: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
2050: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
2060: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
2070: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
2080: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
2090: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
20a0: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
20b0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
20c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
20d0: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
20e0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
20f0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
2100: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
2110: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
2120: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2130: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
2140: 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50  C(P,D,N,X) if( P
2150: 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78  ->xCodec ){ P->x
2160: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2170: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c  rg,D,N,X); }.#el
2180: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
2190: 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69  C(P,D,N,X).#endi
21a0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
21b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
21c0: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
21d0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
21e0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
21f0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
2200: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
2210: 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31   ((void*)(&(P)[1
2220: 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41  ])).#define DATA
2230: 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26  _TO_PGHDR(D)  (&
2240: 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31  ((PgHdr*)(D))[-1
2250: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
2260: 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28  _TO_EXTRA(G,P) (
2270: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
2280: 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e  (&(G)[1]))[(P)->
2290: 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69  pageSize]).#defi
22a0: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ne PGHDR_TO_HIST
22b0: 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20  (P,PGR)  \.     
22c0: 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f         ((PgHisto
22d0: 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  ry*)&((char*)(&(
22e0: 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70  P)[1]))[(PGR)->p
22f0: 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e  ageSize+(PGR)->n
2300: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48  Extra])../*.** H
2310: 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74  ow big to make t
2320: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73  he hash table us
2330: 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  ed for locating 
2340: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a  in-memory pages.
2350: 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ** by page numbe
2360: 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 6c 6f  r. This macro lo
2370: 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73 69 6c  oks a little sil
2380: 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61 6c 75  ly, but is evalu
2390: 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d 70 69  ated.** at compi
23a0: 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72 75 6e  le-time, not run
23b0: 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73 74 20  -time (at least 
23c0: 66 6f 72 20 67 63 63 20 74 68 69 73 20 69 73 20  for gcc this is 
23d0: 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  true)..*/.#defin
23e0: 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c 0a 20  e N_PG_HASH (\. 
23f0: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30 32 34   (MAX_PAGES>1024
2400: 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d 41 58  )?2048: \.  (MAX
2410: 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30 32 34  _PAGES>512)?1024
2420: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2430: 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20 20 28  >256)?512: \.  (
2440: 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29 3f 32  MAX_PAGES>128)?2
2450: 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  56: \.  (MAX_PAG
2460: 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20 5c 0a  ES>64)?128:64 \.
2470: 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20  )../*.** Hash a 
2480: 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23  page number.*/.#
2490: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73  define pager_has
24a0: 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e 5f  h(PN)  ((PN)&(N_
24b0: 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a  PG_HASH-1))../*.
24c0: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
24d0: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
24e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
24f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
2500: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
2510: 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  {.  u8 journalOp
2520: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2530: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
2540: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
2550: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
2560: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
2570: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
2580: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
2590: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
25a0: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
25b0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
25c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
25d0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
25e0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
25f0: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2610: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
2620: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
2630: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
2640: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2650: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2660: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
2670: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2680: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
2690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26a0: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
26b0: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
26c0: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
26d0: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
26e0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
26f0: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
2700: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
2710: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
2720: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
2750: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
2760: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
2770: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2780: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
2790: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
27a0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
27b0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  ess */.  u8 stat
27c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27d0: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e       /* PAGER_UN
27e0: 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f  LOCK, _SHARED, _
27f0: 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a  RESERVED, etc. *
2800: 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20  /.  u8 errMask; 
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2830: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2840: 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  s */.  u8 tempFi
2850: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2860: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2870: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2880: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2890: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
28a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
28b0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
28c0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
28d0: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
28e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28f0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
2900: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
2910: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
2920: 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20  rtyCache;       
2930: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2940: 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68  f cached pages h
2950: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
2960: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
2970: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck;          /* 
2980: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
2990: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
29a0: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
29b0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
29c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
29d0: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
29e0: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
29f0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a10: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2a20: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2a30: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20  o jrnl */.  int 
2a40: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
2a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a60: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2a70: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2a80: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
2a90: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
2aa0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
2ab0: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
2ac0: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae0: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2af0: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
2b00: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
2b10: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b30: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2b40: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
2b50: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
2b60: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
2b70: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
2b80: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
2b90: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
2ba0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73  cksum */.  int s
2bb0: 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20  tmtNRec;        
2bc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2bd0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73   of records in s
2be0: 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  tmt subjournal *
2bf0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20  /.  int nExtra; 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
2c20: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
2c30: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2c40: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c70: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
2c80: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
2cc0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67  */.  int nMaxPag
2cd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ce0: 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d   /* High water m
2cf0: 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a  ark of nPage */.
2d00: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d20: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   Number of in-me
2d30: 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20  mory pages with 
2d40: 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a  PgHdr.nRef>0 */.
2d50: 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20    int mxPage;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d70: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2d80: 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64  of pages to hold
2d90: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 75   in cache */.  u
2da0: 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  8 *aInJournal;  
2db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2dc0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
2dd0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2de0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
2df0: 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20   *aInStmt;      
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2e10: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2e20: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2e30: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  se */.  char *zF
2e40: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
2e50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e60: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e70: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
2e80: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2e90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2ea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
2eb0: 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74  .  char *zDirect
2ec0: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ory;           /
2ed0: 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64  * Directory hold
2ee0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2ef0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20  urnal files */. 
2f00: 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b   OsFile fd, jfd;
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f20: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  File descriptors
2f30: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e   for database an
2f40: 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f  d journal */.  O
2f50: 73 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20  sFile stfd;     
2f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2f70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
2f80: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
2f90: 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42  subjournal*/.  B
2fa0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
2fb0: 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f  yHandler;  /* Po
2fc0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e  inter to sqlite.
2fd0: 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  busyHandler */. 
2fe0: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20   PgHdr *pFirst, 
2ff0: 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20  *pLast;      /* 
3000: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  List of free pag
3010: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
3020: 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20  FirstSynced;    
3030: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65      /* First fre
3040: 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64  e page with PgHd
3050: 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f  r.needSync==0 */
3060: 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20  .  PgHdr *pAll; 
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3080: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  * List of all pa
3090: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
30a0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
30b0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
30c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
30d0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
30e0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
30f0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
3100: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
3110: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
3120: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
3130: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
3140: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3150: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3160: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3170: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3180: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
31a0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
31b0: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
31c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
31d0: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
31e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
31f0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
3200: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
3210: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
3220: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3230: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
3240: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3250: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3260: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3270: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3280: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3290: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
32a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
32b0: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
32c0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
32d0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
32e0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
32f0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
3300: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
3310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3320: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
3330: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
3340: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3350: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
3360: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
3370: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3380: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
3390: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
33a0: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
33b0: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
33c0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
33d0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
33e0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
33f0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3400: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3410: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3420: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3430: 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20  oid *pCodecArg; 
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3450: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
3460: 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 50 67  xCodec() */.  Pg
3470: 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f  Hdr *aHash[N_PG_
3480: 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73  HASH];    /* Has
3490: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
34a0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
34b0: 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Hdr */.};../*.**
34c0: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
34d0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
34e0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
34f0: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
3500: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
3510: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3520: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3530: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3540: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3550: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3560: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
3570: 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63   are bits that c
3580: 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67  an be set in Pag
3590: 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23  er.errMask..*/.#
35a0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
35b0: 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20  _FULL     0x01  
35c0: 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69  /* a write() fai
35d0: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
35e0: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20  AGER_ERR_MEM    
35f0: 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f    0x02  /* mallo
3600: 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64  c() failed */.#d
3610: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3620: 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f  LOCK     0x04  /
3630: 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c  * error in the l
3640: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
3650: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3660: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78  _ERR_CORRUPT  0x
3670: 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20  08  /* database 
3680: 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  or journal corru
3690: 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ption */.#define
36a0: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20   PAGER_ERR_DISK 
36b0: 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e      0x10  /* gen
36c0: 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72  eral disk I/O er
36d0: 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20 64  ror - bad hard d
36e0: 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rive? */../*.** 
36f0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3700: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3710: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3720: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3730: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3740: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3750: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3760: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3770: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3780: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
37a0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
37b0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
37c0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
37d0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
37e0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
37f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3800: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
3810: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3820: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3830: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3840: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3850: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3860: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3870: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3880: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3890: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
38a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
38b0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
38c0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
38d0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
38e0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
38f0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3900: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3910: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3920: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3940: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3950: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3960: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3970: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3980: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3990: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
39a0: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
39b0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
39c0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
39d0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
39e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
39f0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3a00: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3a10: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3a20: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3a30: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3a40: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3a50: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3a60: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3a70: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3a80: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3a90: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3aa0: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3ab0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3ac0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3ad0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3ae0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3af0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3b00: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3b10: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3b20: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
3b30: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
3b40: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
3b50: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
3b60: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
3b70: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
3b80: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3b90: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3ba0: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
3bb0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
3bc0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
3bd0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
3be0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
3bf0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
3c00: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
3c10: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
3c20: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
3c30: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
3c40: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
3c50: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
3c60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
3c70: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
3c80: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
3c90: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
3ca0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
3cb0: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
3cc0: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
3cd0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
3ce0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
3cf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
3d00: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
3d10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3d20: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
3d30: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
3d40: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
3d50: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
3d60: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
3d70: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
3d80: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
3d90: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
3da0: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
3db0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
3dc0: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
3dd0: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
3de0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3df0: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
3e00: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
3e10: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
3e20: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
3e30: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
3e40: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
3e50: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
3e60: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
3e70: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
3e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
3e90: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
3ea0: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
3eb0: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
3ec0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
3ed0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
3ee0: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
3ef0: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
3f00: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
3f10: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3f20: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
3f30: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
3f40: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3f50: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
3f60: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
3f70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 69  * The default si
3f80: 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63  ze of a disk sec
3f90: 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  tor.*/.#define P
3fa0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
3fb0: 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65   512../*.** Page
3fc0: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
3fd0: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
3fe0: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
3ff0: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
4000: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
4010: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
4020: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
4030: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
4040: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
4050: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
4060: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
4070: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
4080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4090: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
40a0: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
40b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
40c0: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
40d0: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
40e0: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
40f0: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
4100: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
4110: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
4120: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64  etails..*/./* #d
4130: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
4140: 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f  GNO(x) (PENDING_
4150: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
4160: 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ize)) */.#define
4170: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4180: 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  ) ((PENDING_BYTE
4190: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
41a0: 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )+1)../*.** The 
41b0: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
41c0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
41d0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
41e0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
41f0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
4200: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65  *.** Enable refe
4210: 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
4220: 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67  king (for debugg
4230: 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69  ing) here:.*/.#i
4240: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4250: 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72  G.  int pager3_r
4260: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20  efinfo_enable = 
4270: 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  0;.  static void
4280: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50   pager_refinfo(P
4290: 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74  gHdr *p){.    st
42a0: 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30  atic int cnt = 0
42b0: 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72  ;.    if( !pager
42c0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
42d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
42e0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
42f0: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
4300: 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e  T: %4d addr=%p n
4310: 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Ref=%d\n",.     
4320: 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52    p->pgno, PGHDR
4330: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
4340: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
4350: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
4360: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
4370: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
4380: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
4390: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
43a0: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
43b0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
43c0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
43d0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
43e0: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
43f0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4400: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
4410: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
4420: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
4430: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
4440: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
4450: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
4460: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
4470: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4480: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4490: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
44a0: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
44b0: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
44c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
44d0: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
44e0: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
44f0: 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  u32 res;.  int r
4500: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
4510: 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  3OsRead(fd, &res
4520: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
4530: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4540: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  _OK ){.    unsig
4550: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4560: 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26      memcpy(ac, &
4570: 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73  res, 4);.    res
4580: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
4590: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
45a0: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
45b0: 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  ];.  }.  *pRes =
45c0: 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72   res;.  return r
45d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
45e0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
45f0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
4600: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4610: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4620: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4630: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4640: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4650: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4660: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4670: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4680: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75  d, u32 val){.  u
4690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
46a0: 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  4];.  ac[0] = (v
46b0: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
46c0: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
46d0: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
46e0: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
46f0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
4700: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
4710: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
4720: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
4730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4740: 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  the 32-bit integ
4750: 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68  er 'val' into th
4760: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
4770: 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72  d by page header
4780: 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65  .** 'p' at offse
4790: 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73  t 'offset'..*/.s
47a0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
47b0: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
47c0: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
47d0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
47e0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
47f0: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
4800: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
4810: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
4820: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4830: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4840: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4850: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4860: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4870: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4880: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
4890: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
48a0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
48b0: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
48c0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
48d0: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
48e0: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
48f0: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4900: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4910: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4930: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4940: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4950: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4960: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4970: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4980: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4990: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
49a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
49b0: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
49c0: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
49d0: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
49e0: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
49f0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
4a00: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
4a10: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
4a20: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4a30: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
4a40: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4a50: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
4a60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a70: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
4a80: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4a90: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
4aa0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
4ab0: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
4ac0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4ad0: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4ae0: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4af0: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4b00: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4b10: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4b20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4b30: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
4b40: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4b50: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
4b60: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
4b70: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
4b80: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
4b90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4ba0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
4bb0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
4bc0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
4bd0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
4be0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
4bf0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4c00: 65 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  e){.  u32 hash =
4c10: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75   0;.  int i;.  u
4c20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4c30: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
4c40: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
4c50: 44 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66  DATA(pPage);.  f
4c60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
4c70: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
4c80: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4c90: 68 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61  h = (hash+i)^pDa
4ca0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
4cb0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a  urn hash;.}../*.
4cc0: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
4cd0: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
4ce0: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
4cf0: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
4d00: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
4d10: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
4d20: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
4d30: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
4d40: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
4d50: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
4d60: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
4d70: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
4d80: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
4d90: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
4da0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
4db0: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
4dc0: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
4dd0: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
4de0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
4df0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4e00: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
4e10: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
4e20: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   || pPager->errM
4e30: 61 73 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  ask || MEMDB || 
4e40: 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20  pPg->dirty || . 
4e50: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
4e60: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
4e70: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
4e80: 6c 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43  lse.#define CHEC
4e90: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
4ea0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
4eb0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
4ec0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
4ed0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
4ee0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
4ef0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
4f00: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
4f10: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
4f20: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
4f30: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
4f40: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4f50: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4f60: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
4f70: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
4f80: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
4f90: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
4fa0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
4fb0: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
4fc0: 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73  iteFree() *pzMas
4fd0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ter..**.** If no
4fe0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4ff0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
5000: 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69  sent *pzMaster i
5010: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
5020: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
5030: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
5040: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
5050: 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a  urnal(OsFile *pJ
5060: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
5070: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5080: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
5090: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
50a0: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
50b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
50c0: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
50d0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
50e0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
50f0: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
5100: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5110: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
5120: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
5130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5140: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
5150: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
5160: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
5170: 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28  , szJ-16);.  if(
5180: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5190: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20   return rc;. .  
51a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
51b0: 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20  pJrnl, &len);.  
51c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
51d0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
51e0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
51f0: 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29  s(pJrnl, &cksum)
5200: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5210: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5220: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5230: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
5240: 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66  aMagic, 8);.  if
5250: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5260: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
5270: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
5280: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
5290: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
52a0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
52b0: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
52c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
52d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a   return rc;..  *
52e0: 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72  pzMaster = (char
52f0: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
5300: 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a  len+1);.  if( !*
5310: 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  pzMaster ){.    
5320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5330: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
5340: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5350: 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20  rnl, *pzMaster, 
5360: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
5370: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5380: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
5390: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
53a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
53b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
53c0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
53d0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
53e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
53f0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
5400: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
5410: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
5420: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a  (*pzMaster)[i];.
5430: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
5440: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
5450: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
5460: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
5470: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
5480: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
5490: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
54a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
54b0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
54c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
54d0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
54e0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
54f0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
5500: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
5510: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
5520: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
5530: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
5540: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5550: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
5560: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
5570: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
5580: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e   (*pzMaster)[len
5590: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
55a0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
55b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
55c0: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  eek the journal 
55d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
55e0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
55f0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72  or boundary wher
5600: 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  e a.** journal h
5610: 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61  eader may be rea
5620: 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61  d or written. Pa
5630: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  ger.journalOff i
5640: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a  s updated with.*
5650: 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f  * the new seek o
5660: 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ffset..**.** i.e
5670: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
5680: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
5690: 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20   Input Offset   
56a0: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
56b0: 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d  t Offset.** ----
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20  ---.** 0        
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20   0.** 512       
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20  512.** 100      
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20   512.** 2000    
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
5770: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75  atic int seekJou
5780: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
5790: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
57a0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
57b0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
57c0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
57d0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
57e0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
57f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
5800: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
5810: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
5820: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
5830: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
5840: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
5850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
5860: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
5870: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
5880: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5890: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
58a0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
58b0: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  et;.  return sql
58c0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
58d0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
58e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a  >journalOff);.}.
58f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5900: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
5910: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
5920: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5930: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
5940: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
5950: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
5960: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
5970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
5980: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5990: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
59a0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
59b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
59c0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
59d0: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
59e0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
59f0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
5a00: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
5a10: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
5a20: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
5a30: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
5a40: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
5a50: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
5a60: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
5a70: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
5a80: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
5a90: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
5aa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5ab0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
5ac0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
5ad0: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
5ae0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
5af0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
5b00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
5b10: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
5b20: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
5b30: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
5b40: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5b50: 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63  ager){..  int rc
5b60: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5b70: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5b80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5b90: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5ba0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5bb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5bc0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5bd0: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5be0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5bf0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5c00: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5c10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5c20: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5c30: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
5c40: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
5c50: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
5c60: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
5c70: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
5c80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
5c90: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
5ca0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
5cb0: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
5cc0: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
5cd0: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
5ce0: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
5cf0: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
5d00: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
5d10: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
5d20: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
5d30: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
5d40: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
5d50: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
5d60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
5d70: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
5d80: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
5d90: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
5da0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
5db0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5dc0: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
5dd0: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
5de0: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
5df0: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  . */.    rc = wr
5e00: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5e10: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5e20: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
5e30: 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
5e40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5e50: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
5e60: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
5e70: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
5e80: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e   .    sqlite3Ran
5e90: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
5ea0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5eb0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
5ec0: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d  mInit);.    rc =
5ed0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5ee0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5ef0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
5f00: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5f10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5f20: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
5f30: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
5f40: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
5f50: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5f60: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
5f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
5f80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5f90: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
5fa0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
5fb0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
5fc0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5fd0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5fe0: 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  d, pPager->secto
5ff0: 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rSize);.  }..  /
6000: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
6010: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
6020: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
6030: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
6040: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
6050: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
6060: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
6070: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
6080: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
6090: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
60a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
60b0: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
60c0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
60d0: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69  nalOff-1);.    i
60e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
60f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6100: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
6110: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
6120: 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  0", 1);.    }.  
6130: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6140: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6150: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
6160: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
6170: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6180: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
6190: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
61a0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
61b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
61c0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
61d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
61e0: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
61f0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
6200: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
6210: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
6220: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
6230: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
6240: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
6250: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
6260: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
6270: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
6280: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6290: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
62a0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
62b0: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
62c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
62d0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
62e0: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
62f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
6300: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
6310: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
6320: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
6330: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
6340: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
6350: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
6360: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6370: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
6380: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
6390: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
63a0: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
63b0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
63c0: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
63d0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
63e0: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
63f0: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
6400: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6410: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
6420: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6430: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
6440: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6450: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6460: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
6470: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
6480: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
6490: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
64a0: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
64b0: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
64c0: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
64d0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
64e0: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
64f0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6500: 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73  der */..  rc = s
6510: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6520: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6530: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6540: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
6550: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
6560: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
6570: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
6580: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6590: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
65a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
65b0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
65c0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
65d0: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
65e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
65f0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
6600: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
6610: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6620: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
6630: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
6640: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
6650: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
6660: 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20  >jfd, pNRec);.  
6670: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6680: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
6690: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
66a0: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
66b0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
66c0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
66d0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
66e0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
66f0: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
6700: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6710: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
6720: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
6730: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
6740: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
6750: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
6760: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
6770: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
6780: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
6790: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
67a0: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
67b0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
67c0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
67d0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
67e0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
67f0: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
6800: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
6810: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
6820: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
6830: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
6840: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
6850: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
6860: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70   = read32bits(&p
6870: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32  Pager->jfd, (u32
6880: 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74   *)&pPager->sect
6890: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  orSize);.  if( r
68a0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
68b0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
68c0: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
68d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
68e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
68f0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
6900: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6910: 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  alOff);.  return
6920: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
6930: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
6940: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
6950: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
6960: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
6970: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
6980: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
6990: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
69a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
69b0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
69c0: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
69d0: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
69e0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
69f0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
6a00: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
6a10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
6a20: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
6a30: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
6a40: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
6a50: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
6a60: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
6a70: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
6a80: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
6a90: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
6aa0: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
6ab0: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
6ac0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
6ad0: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
6ae0: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
6af0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
6b00: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
6b10: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
6b20: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
6b30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
6b40: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
6b50: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
6b60: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
6b70: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
6b80: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
6b90: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
6ba0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
6bb0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
6bc0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
6bd0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
6be0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20    int i; .  u32 
6bf0: 63 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69  cksum = 0; ..  i
6c00: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
6c10: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
6c20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6c30: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  OK;.  pPager->se
6c40: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20  tMaster = 1;..  
6c50: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61  len = strlen(zMa
6c60: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
6c70: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
6c80: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
6c90: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
6ca0: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
6cb0: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
6cc0: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
6cd0: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
6ce0: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
6cf0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6d00: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
6d10: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
6d20: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
6d30: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
6d40: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
6d50: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
6d60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
6d70: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
6d80: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
6d90: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
6da0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6db0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
6dc0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
6dd0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b  rnalOff += (len+
6de0: 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  20);..  rc = wri
6df0: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
6e00: 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f  ->jfd, PAGER_MJ_
6e10: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
6e20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6e30: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
6e40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6e50: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
6e60: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
6e70: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
6e80: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6e90: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69   rc;..  rc = wri
6ea0: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
6eb0: 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69  ->jfd, len);.  i
6ec0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6ed0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6ee0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
6ef0: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
6f00: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
6f10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6f20: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6f30: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
6f40: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
6f50: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6f60: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6f70: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
6f80: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
6f90: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
6fa0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6fb0: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
6fc0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
6fd0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
6fe0: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
6ff0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
7000: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
7010: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
7020: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
7030: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
7040: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
7050: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
7060: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
7070: 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  s the sqlite3pag
7080: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29  er_stmt_commit()
7090: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
70a0: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
70b0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
70c0: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
70d0: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
70e0: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
70f0: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
7100: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
7110: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
7120: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
7130: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
7140: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
7150: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
7160: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
7170: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
7180: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
7190: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
71a0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
71b0: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
71c0: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
71d0: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
71e0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
71f0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
7200: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
7210: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
7220: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
7230: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
7240: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
7250: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
7260: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
7270: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
7280: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
7290: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
72a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
72b0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
72c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
72d0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
72e0: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
72f0: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
7300: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
7310: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
7320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7330: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
7340: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
7350: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
7360: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
7370: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
7380: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
7390: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
73a0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
73b0: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
73c0: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
73d0: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
73e0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
73f0: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
7400: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
7410: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
7420: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
7430: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
7440: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
7450: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
7460: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
7470: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
7480: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7490: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
74a0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
74b0: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
74c0: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
74d0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
74e0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
74f0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
7500: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d  ager_hash(pgno)]
7510: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
7520: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
7530: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
7540: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
7550: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
7560: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
7570: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
7580: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
7590: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
75a0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
75b0: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
75c0: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
75d0: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
75e0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
75f0: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
7600: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
7610: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
7620: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
7630: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
7640: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
7650: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
7660: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
7670: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7680: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
7690: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
76a0: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
76b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
76c0: 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  k ) return;.  fo
76d0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
76e0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
76f0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
7700: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
7710: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
7720: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
7730: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
7740: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
7750: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
7760: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
7770: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
7780: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   0;.  memset(pPa
7790: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
77a0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
77b0: 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ash));.  pPager-
77c0: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  >nPage = 0;.  if
77d0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
77e0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
77f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
7800: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
7810: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
7820: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
7830: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
7840: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
7850: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
7860: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  K;.  pPager->dbS
7870: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  ize = -1;.  pPag
7880: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
7890: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
78a0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
78b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
78c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
78d0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 70 61   to reset the pa
78e0: 67 65 72 20 61 66 74 65 72 20 61 20 6d 61 6c 6c  ger after a mall
78f0: 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 20 54 68  oc() failure. Th
7900: 69 73 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 77 6f  is.** doesn't wo
7910: 72 6b 20 77 69 74 68 20 69 6e 2d 6d 65 6d 6f 72  rk with in-memor
7920: 79 20 64 61 74 61 62 61 73 65 73 2e 20 49 66 20  y databases. If 
7930: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
7940: 20 77 68 65 6e 20 61 6e 20 0a 2a 2a 20 69 6e 2d   when an .** in-
7950: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
7960: 69 73 20 69 6e 20 75 73 65 20 69 74 20 69 73 20  is in use it is 
7970: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
7980: 72 65 63 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  recover..**.** I
7990: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
79a0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  or statement tra
79b0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
79c0: 76 65 2c 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  ve, it is rolled
79d0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 74 20   back..**.** It 
79e0: 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  is an error to c
79f0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
7a00: 6e 20 69 66 20 61 6e 79 20 70 61 67 65 73 20 61  n if any pages a
7a10: 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69  re in use..*/.#i
7a20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7a30: 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a  T_GLOBALRECOVER.
7a40: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
7a50: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
7a60: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
7a70: 67 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ger ){.    if( p
7a80: 50 61 67 65 72 2d 3e 6e 52 65 66 20 7c 7c 20 4d  Pager->nRef || M
7a90: 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65  EMDB ){.      re
7aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
7ab0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  R;.    }.    pPa
7ac0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 3d 20  ger->errMask &= 
7ad0: 7e 28 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 29  ~(PAGER_ERR_MEM)
7ae0: 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
7af0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
7b00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b10: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  K;.}.#endif.../*
7b20: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
7b30: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
7b40: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
7b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7b60: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
7b70: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
7b80: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
7b90: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
7ba0: 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73  routine releases
7bb0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
7bc0: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
7bd0: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
7be0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20   in its place.  
7bf0: 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  The journal.** f
7c00: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 61  ile is deleted a
7c10: 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  nd closed..**.**
7c20: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
7c30: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
7c40: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
7c50: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
7c60: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
7c70: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
7c80: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
7c90: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
7ca0: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
7cb0: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
7cc0: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
7cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7ce0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
7cf0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
7d00: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
7d10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
7d20: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
7d30: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
7d40: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
7d50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7d60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
7d70: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
7d80: 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
7d90: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7da0: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
7db0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7dc0: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
7dd0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
7de0: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  pen = 0;.  }.  i
7df0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
7e00: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
7e10: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
7e20: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
7e30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7e40: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  pen = 0;.    sql
7e50: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
7e60: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
7e70: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
7e80: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7e90: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
7ea0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
7eb0: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
7ec0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7ed0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7ee0: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
7ef0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
7f00: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
7f10: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7f20: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69  needSync = 0;.#i
7f30: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
7f40: 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
7f50: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
7f60: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
7f70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
7f80: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
7f90: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
7fa0: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
7fb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7fc0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
7fd0: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
7fe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
7ff0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
8000: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
8010: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
8020: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
8030: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
8040: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
8050: 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  K);.  pPager->st
8060: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
8070: 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72  ED;.  pPager->or
8080: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
8090: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
80a0: 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  r = 0;.  return 
80b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
80c0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
80d0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
80e0: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
80f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
8100: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
8110: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
8120: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
8130: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
8140: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
8150: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
8160: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
8170: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
8180: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
8190: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
81a0: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
81b0: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
81c0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
81d0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
81e0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
81f0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
8200: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
8210: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
8220: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
8230: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
8240: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
8250: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
8260: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
8270: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
8280: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
8290: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
82a0: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
82b0: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
82c0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
82d0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
82e0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
82f0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
8300: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
8310: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
8320: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
8330: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
8340: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
8350: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
8360: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
8370: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
8380: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
8390: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
83a0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
83b0: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
83c0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
83d0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
83e0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
83f0: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
8400: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
8410: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
8420: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
8430: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
8440: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
8450: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
8460: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
8470: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
8480: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
8490: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
84a0: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
84b0: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
84c0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
84d0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
84e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
84f0: 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20  gno pgno, const 
8500: 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20  char *aData){.  
8510: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
8520: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
8530: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
8540: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
8550: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
8560: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
8570: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
8580: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
8590: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
85a0: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
85b0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
85c0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
85d0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
85e0: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
85f0: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
8600: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
8610: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
8620: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
8630: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
8640: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
8650: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
8660: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
8670: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
8680: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8690: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
86a0: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
86b0: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
86c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
86d0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
86e0: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
86f0: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
8700: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
8710: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
8720: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
8730: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8740: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
8750: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
8760: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8780: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
8790: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
87a0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
87b0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
87c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
87d0: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
87e0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
87f0: 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54    u8 aData[SQLIT
8800: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d  E_MAX_PAGE_SIZE]
8810: 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61  ;  /* Temp stora
8820: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
8830: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
8840: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
8850: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
8860: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
8870: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
8880: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
8890: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
88a0: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
88b0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
88c0: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
88d0: 3f 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a  ? &pPager->jfd :
88e0: 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20   &pPager->stfd) 
88f0: 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  );...  rc = read
8900: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e  32bits(jfd, &pgn
8910: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
8920: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8930: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
8940: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26  te3OsRead(jfd, &
8950: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
8960: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
8970: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8980: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
8990: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
89a0: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
89b0: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
89c0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
89d0: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
89e0: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
89f0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
8a00: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
8a10: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
8a20: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
8a30: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
8a40: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
8a50: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
8a60: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
8a70: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
8a80: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
8a90: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
8aa0: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
8ab0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
8ac0: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
8ad0: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
8ae0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
8af0: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
8b00: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
8b10: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
8b20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8b30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
8b40: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
8b50: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
8b60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8b70: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
8b80: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
8b90: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
8ba0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
8bb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8bc0: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
8bd0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
8be0: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
8bf0: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  sum(pPager, pgno
8c00: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
8c10: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8c20: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8c30: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
8c40: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8c50: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
8c60: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
8c70: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
8c80: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
8c90: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
8ca0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
8cb0: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
8cc0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
8cd0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
8ce0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
8cf0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
8d00: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
8d10: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
8d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8d30: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
8d40: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
8d50: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
8d60: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
8d70: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
8d80: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
8d90: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
8da0: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
8db0: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
8dc0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
8dd0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
8de0: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
8df0: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
8e00: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
8e10: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
8e20: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
8e30: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
8e40: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
8e50: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
8e60: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
8e70: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
8e80: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
8e90: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
8ea0: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
8eb0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
8ec0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
8ed0: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
8ee0: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
8ef0: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
8f00: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
8f10: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
8f20: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
8f30: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
8f40: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
8f50: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
8f60: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
8f70: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
8f80: 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74  ontents are in t
8f90: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
8fa0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
8fb0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20  Otherwise, if a 
8fc0: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63  full ROLLBACK oc
8fd0: 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73  curs after the s
8fe0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f  tatement.  ** ro
8ff0: 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20  llback the full 
9000: 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f  ROLLBACK will no
9010: 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61  t restore the pa
9020: 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ge to its origin
9030: 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  al.  ** content.
9040: 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
9050: 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66   must be met bef
9060: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
9070: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
9080: 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
9090: 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
90a0: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
90b0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
90c0: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  riginal.  ** pag
90d0: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20  e content is in 
90e0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
90f0: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
9100: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
9110: 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72  in.  ** cache or
9120: 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b   else it is mark
9130: 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
9140: 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  0..  */.  pPg = 
9150: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
9160: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
9170: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
9180: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9190: 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29  SIVE || pPg!=0 )
91a0: 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59  ;.  TRACE3("PLAY
91b0: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c  BACK %d page %d\
91c0: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
91d0: 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  er), pgno);.  if
91e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
91f0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9200: 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70   && (pPg==0 || p
9210: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29  Pg->needSync==0)
9220: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9230: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
9240: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
9250: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
9260: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
9270: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9280: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9290: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
92a0: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
92b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
92c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
92d0: 20 70 50 67 20 29 20 70 50 67 2d 3e 64 69 72 74   pPg ) pPg->dirt
92e0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 0;.  }.  if(
92f0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
9300: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
9310: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
9320: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
9330: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
9340: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
9350: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
9360: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
9370: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
9380: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
9390: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
93a0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
93b0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
93c0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
93d0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
93e0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
93f0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
9400: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
9410: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
9420: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
9430: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
9440: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
9450: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
9460: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
9470: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
9480: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
9490: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
94a0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
94b0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
94c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
94d0: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
94e0: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
94f0: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
9500: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
9510: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
9520: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
9530: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
9540: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9550: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
9560: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
9570: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
9580: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
9590: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f  );.#endif.    CO
95a0: 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
95b0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
95c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
95d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
95e0: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
95f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
9600: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9610: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
9620: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
9630: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
9640: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9650: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
9660: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
9670: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9680: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
9690: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
96a0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
96b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
96c0: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
96d0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  t is..**.** The 
96e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
96f0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
9700: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68   names of all ch
9710: 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ild journals..**
9720: 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61   To tell if a ma
9730: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
9740: 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65   be deleted, che
9750: 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68  ck to each of th
9760: 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20  e.** children.  
9770: 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  If all children 
9780: 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69  are either missi
9790: 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66  ng or do not ref
97a0: 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65  er to.** a diffe
97b0: 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  rent master jour
97c0: 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  nal, then this m
97d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
97e0: 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  n be deleted..*/
97f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
9800: 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73  r_delmaster(cons
9810: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
9820: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
9830: 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20  t master_open = 
9840: 30 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74  0;.  OsFile mast
9850: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  er;.  char *zMas
9860: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
9870: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
9880: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9890: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
98a0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
98b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
98c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
98d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
98e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
98f0: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
9900: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
9910: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
9920: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
9930: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
9940: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
9950: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
9960: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d  erence..  */.  m
9970: 65 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30  emset(&master, 0
9980: 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29  , sizeof(master)
9990: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
99a0: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
99b0: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
99c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
99d0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
99e0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
99f0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
9a00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9a10: 46 69 6c 65 53 69 7a 65 28 26 6d 61 73 74 65 72  FileSize(&master
9a20: 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
9a30: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
9a40: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
9a50: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
9a60: 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72   if( nMasterJour
9a70: 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61  nal>0 ){.    cha
9a80: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  r *zJournal;.   
9a90: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
9aa0: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c  r = 0;..    /* L
9ab0: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
9ac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9ad0: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
9ae0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
9af0: 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ** sqliteMalloc(
9b00: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
9b10: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
9b20: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
9b30: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
9b40: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
9b50: 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
9b60: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21  rnal);.    if( !
9b70: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
9b80: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
9b90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9ba0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9bb0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
9bc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
9bd0: 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(&master, zMast
9be0: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
9bf0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9c00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9c10: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9c20: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
9c30: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
9c40: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
9c50: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
9c60: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
9c70: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9c80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9c90: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f  OsFileExists(zJo
9ca0: 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  urnal) ){.      
9cb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
9cc0: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
9cd0: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
9ce0: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
9cf0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
9d00: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
9d10: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
9d20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9d30: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
9d40: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
9d50: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
9d60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9d70: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
9d80: 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20  .        OsFile 
9d90: 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20  journal;.       
9da0: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
9db0: 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c   memset(&journal
9dc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72  , 0, sizeof(jour
9dd0: 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 72  nal));.        r
9de0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
9df0: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e  nReadOnly(zJourn
9e00: 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  al, &journal);. 
9e10: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
9e20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9e30: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9e40: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9e50: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
9e60: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
9e70: 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a  nal(&journal, &z
9e80: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
9e90: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9ea0: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
9eb0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9ec0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9ed0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9ee0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9ef0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
9f00: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
9f10: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
9f20: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
9f30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
9f40: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
9f50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
9f60: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
9f70: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
9f80: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
9f90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9fa0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
9fb0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
9fc0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
9fd0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9fe0: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
9ff0: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
a000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
a010: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
a020: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
a030: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
a040: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
a050: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
a060: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
a070: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
a080: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
a090: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a0a0: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
a0b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a0c0: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
a0d0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
a0e0: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
a0f0: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
a100: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
a110: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
a120: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
a130: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
a140: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a150: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a160: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
a170: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
a180: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
a190: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
a1a0: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
a1b0: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
a1c0: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
a1d0: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
a1e0: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
a1f0: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
a200: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
a210: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
a220: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
a230: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
a240: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a250: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
a260: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a270: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
a280: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a290: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
a2a0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
a2b0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
a2c0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
a2d0: 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  [SQLITE_MAX_PAGE
a2e0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
a2f0: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
a300: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a310: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
a320: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
a330: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
a340: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
a350: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  (&pPager->fd, pP
a360: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
a370: 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
a380: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
a390: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a3a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a3b0: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
a3c0: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
a3d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
a3f0: 41 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64  ACE3("REFETCH %d
a400: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
a410: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
a420: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
a430: 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
a440: 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
a450: 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70  er, zBuf, pPg->p
a460: 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c  gno, 2);.    }el
a470: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
a480: 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72  (zBuf, 0, pPager
a490: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a4a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
a4b0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
a4c0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
a4d0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
a4e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
a4f0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47  .      memcpy(PG
a500: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a510: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
a520: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a530: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
a540: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
a550: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
a560: 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
a570: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
a580: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a5a0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
a5b0: 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
a5c0: 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
a5d0: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
a5e0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e      }.    pPg->n
a5f0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
a600: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
a610: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a620: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a630: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a640: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a650: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  g);.#endif.  }. 
a660: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a670: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
a680: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
a690: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
a6a0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
a6b0: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
a6c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a6d0: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
a6e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a6f0: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  int nPage){.  as
a700: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
a710: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
a720: 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  SIVE );.  return
a730: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
a740: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
a750: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a760: 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a  *(i64)nPage);.}.
a770: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
a780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
a790: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
a7a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
a7b0: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
a7c0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
a7d0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
a7e0: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
a7f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
a800: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
a810: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
a820: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
a830: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
a840: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
a850: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
a860: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
a870: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
a880: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
a890: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
a8a0: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
a8b0: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
a8c0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
a8d0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
a8e0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
a8f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
a900: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
a910: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
a920: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
a930: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
a940: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
a950: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
a960: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
a970: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
a980: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
a990: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
a9a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
a9b0: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
a9c0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
a9d0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
a9e0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
a9f0: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
aa00: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
aa10: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
aa20: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
aa30: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
aa40: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
aa50: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
aa60: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
aa70: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
aa80: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
aa90: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
aaa0: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
aab0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
aac0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
aad0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
aae0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
aaf0: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
ab00: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
ab10: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
ab20: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
ab30: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
ab40: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
ab50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
ab60: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
ab70: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
ab80: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
ab90: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
aba0: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
abb0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
abc0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
abd0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
abe0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
abf0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
ac00: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
ac10: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
ac20: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
ac30: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
ac40: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
ac50: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
ac60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
ac70: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
ac80: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
ac90: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
aca0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
acb0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
acc0: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
acd0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
ace0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
acf0: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
ad00: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
ad10: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
ad20: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
ad30: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
ad40: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
ad50: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
ad60: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
ad70: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
ad80: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
ad90: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
ada0: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
adb0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
adc0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
add0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
ade0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
adf0: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
ae00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
ae10: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
ae20: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
ae30: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
ae40: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
ae50: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
ae60: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
ae70: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
ae80: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
ae90: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
aea0: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
aeb0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
aec0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
aed0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
aee0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
aef0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
af00: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
af10: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
af20: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
af30: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
af40: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
af50: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
af60: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
af70: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
af80: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
af90: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
afa0: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
afb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
afc0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
afd0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
afe0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
aff0: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
b000: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
b010: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
b020: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
b030: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
b040: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
b050: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
b060: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
b070: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
b080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b090: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
b0a0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
b0b0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
b0c0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
b0d0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
b0e0: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
b0f0: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
b100: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
b110: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
b120: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
b130: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
b140: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
b150: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
b160: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
b170: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
b180: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
b190: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
b1a0: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
b1b0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
b1c0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
b1d0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
b1e0: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
b1f0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
b200: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
b210: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
b220: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b230: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
b240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b250: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
b260: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
b270: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b290: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
b2a0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
b2b0: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b2e0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
b2f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
b300: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
b310: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
b320: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
b330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b340: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
b350: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
b360: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
b370: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
b380: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
b390: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
b3a0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
b3b0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
b3c0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
b3d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
b3e0: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
b3f0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
b400: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
b410: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
b420: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
b430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b440: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
b450: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
b460: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b470: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
b480: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
b490: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
b4a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b4b0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
b4c0: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
b4d0: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
b4e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b4f0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
b500: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
b510: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
b520: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
b530: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
b540: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
b550: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
b560: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
b570: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  d back..  */.  r
b580: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
b590: 75 72 6e 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a  urnal(&pPager->j
b5a0: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
b5b0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
b5c0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
b5d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b5e0: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
b5f0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
b600: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
b610: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
b620: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
b630: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
b640: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
b650: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
b660: 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
b670: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
b680: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
b690: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  &pPager->jfd, 0)
b6a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
b6b0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
b6c0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
b6d0: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
b6e0: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
b6f0: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
b700: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
b710: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
b720: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
b730: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
b740: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
b750: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
b760: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
b770: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
b780: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
b790: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
b7a0: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
b7b0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
b7c0: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
b7d0: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
b7e0: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
b7f0: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
b800: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
b810: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
b820: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
b830: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
b840: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
b850: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
b860: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
b870: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
b880: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
b890: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b8a0: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
b8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b8c0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
b8d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b8e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
b8f0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
b900: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b910: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
b920: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
b930: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
b940: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
b950: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
b960: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
b970: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
b980: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
b990: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
b9a0: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
b9b0: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
b9c0: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
b9d0: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
b9e0: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
b9f0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
ba00: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
ba10: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
ba20: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
ba30: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
ba40: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ba50: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
ba60: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ba70: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
ba80: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
ba90: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
baa0: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
bab0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
bac0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
bad0: 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
bae0: 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
baf0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
bb00: 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
bb10: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
bb20: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
bb30: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
bb40: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
bb50: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
bb60: 55 53 49 56 45 20 26 26 20 0a 20 20 20 20 20 20  USIVE && .      
bb70: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bb80: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
bb90: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
bba0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
bbb0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
bbc0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
bbd0: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
bbe0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
bbf0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
bc00: 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
bc10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bc20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
bc30: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bc50: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
bc60: 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
bc70: 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69 74 65    /* rc = sqlite
bc80: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
bc90: 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f 48 44  >jfd, JOURNAL_HD
bca0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 20 2a  R_SZ(pPager)); *
bcb0: 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  /.    if( rc!=SQ
bcc0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
bcd0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 0a  nd_playback;.  .
bce0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
bcf0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
bd00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
bd10: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
bd20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bd30: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
bd40: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
bd50: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
bd60: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
bd70: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
bd80: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
bd90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bda0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
bdb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bdc0: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
bdd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
bde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
bdf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
be00: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
be10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
be20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
be30: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
be40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
be50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
be60: 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20    /* Pages that 
be70: 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
be80: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
be90: 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65   but never synce
bea0: 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74  d.  ** where not
beb0: 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68 65   restored by the
bec0: 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65   loop above.  We
bed0: 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65   have to restore
bee0: 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65   those.  ** page
bef0: 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  s by reading the
bf00: 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  m back from the 
bf10: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
bf20: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
bf30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bf40: 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c 6f 61  );.  pager_reloa
bf50: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
bf60: 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
bf70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bf80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
bf90: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
bfa0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
bfb0: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
bfc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
bfd0: 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
bfe0: 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
bff0: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
c000: 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73  n true,.    ** s
c010: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
c020: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
c030: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c040: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
c050: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c060: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c070: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d  ger_delmaster(zM
c080: 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  aster);.    }.  
c090: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
c0a0: 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
c0b0: 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
c0c0: 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
c0d0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
c0e0: 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
c0f0: 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
c100: 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
c110: 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
c120: 20 61 20 64 69 66 66 65 72 65 6e 74 20 50 41 47   a different PAG
c130: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  ER_SECTOR_SIZE. 
c140: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
c150: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
c160: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
c170: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
c180: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
c190: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
c1a0: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75  TOR_SIZE;.  retu
c1b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c1c0: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
c1d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
c1e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
c1f0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
c200: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
c210: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
c220: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
c230: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
c240: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
c250: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
c260: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
c270: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
c280: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
c290: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
c2a0: 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
c2b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
c2c0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
c2d0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
c2e0: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
c2f0: 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
c300: 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
c310: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
c320: 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
c330: 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
c340: 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
c350: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
c360: 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
c370: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
c380: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
c390: 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
c3a0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
c3b0: 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
c3c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
c3d0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
c3e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
c3f0: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
c400: 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
c410: 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c430: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
c440: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c470: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
c480: 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
c490: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64  ournalOff;.#ifnd
c4a0: 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20  ef NDEBUG .  {. 
c4b0: 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20     i64 os_szJ;. 
c4c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c4d0: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
c4e0: 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29  r->jfd, &os_szJ)
c4f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
c500: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
c510: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
c520: 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a   szJ==os_szJ );.
c530: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
c540: 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
c550: 65 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  e the offset to 
c560: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
c570: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
c580: 0a 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65  .  ** this state
c590: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
c5a0: 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
c5b0: 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
c5c0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
c5d0: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
c5e0: 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
c5f0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
c600: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
c610: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
c620: 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
c630: 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
c640: 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
c650: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e    }.  .  /* Trun
c660: 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
c670: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
c680: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
c690: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
c6a0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
c6b0: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
c6c0: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
c6d0: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
c6e0: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d  ->stmtSize);.  }
c6f0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
c700: 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
c710: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Size;..  /* Figu
c720: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
c730: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
c740: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c750: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
c760: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
c770: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
c780: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
c790: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
c7a0: 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
c7b0: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
c7c0: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
c7d0: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
c7e0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
c7f0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
c800: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
c810: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
c820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
c830: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
c840: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
c850: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
c860: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
c870: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
c880: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
c890: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
c8a0: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
c8b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
c8c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
c8d0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
c8e0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
c8f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
c900: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
c910: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
c920: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
c930: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
c940: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c950: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
c960: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
c970: 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f    /* Now roll so
c980: 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72  me pages back fr
c990: 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  om the transacti
c9a0: 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65  on journal. Page
c9b0: 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a  r.stmtJSize.  **
c9c0: 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66   was the size of
c9d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c9e0: 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74  e when this stat
c9f0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
ca00: 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79  d, so.  ** every
ca10: 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74  thing after that
ca20: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
ca30: 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72  led back, either
ca40: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
ca50: 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d  atabase, the mem
ca60: 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f  ory cache, or bo
ca70: 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  th..  **.  ** If
ca80: 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   it is not zero,
ca90: 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74   then Pager.stmt
caa0: 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66  HdrOff is the of
cab0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
cac0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69  t.  ** of the fi
cad0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
cae0: 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e  er written durin
caf0: 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  g this statement
cb00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
cb10: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
cb20: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
cb30: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
cb40: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
cb50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cb60: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
cb70: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
cb80: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
cb90: 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
cba0: 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61  stmtJSize;.  pPa
cbb0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d  ger->cksumInit =
cbc0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
cbd0: 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f  um;.  assert( JO
cbe0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
cbf0: 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61  ger)<(pPager->pa
cc00: 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77  geSize+8) );.  w
cc10: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
cc20: 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72  urnalOff <= (hdr
cc30: 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67  Off-(pPager->pag
cc40: 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20  eSize+8)) ){.   
cc50: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
cc60: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
cc70: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
cc80: 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  fd, 1);.    asse
cc90: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
cca0: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
ccb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
ccc0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
ccd0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
cce0: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
ccf0: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
cd00: 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b 0a 20  .    u32 nRec;. 
cd10: 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
cd20: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
cd30: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
cd40: 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d 79  J, &nRec, &dummy
cd50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
cd60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd70: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
cd80: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
cd90: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
cda0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
cdb0: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
cdc0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
cdd0: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
cde0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
cdf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
ce00: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
ce10: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
ce20: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
ce30: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
ce40: 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
ce50: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
ce60: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
ce70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
ce80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
ce90: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cea0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
ceb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
cec0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
ced0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
cee0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cef0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
cf00: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
cf10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
cf20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
cf30: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
cf40: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
cf50: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
cf60: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c  E_CORRUPT;.  }el
cf70: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
cf80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
cf90: 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72  ;.    /* pager_r
cfa0: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
cfb0: 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  er); */.  }.  re
cfc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cfd0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
cfe0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
cff0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
d000: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
d010: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d020: 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73  pager_set_caches
d030: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
d040: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
d050: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
d060: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
d070: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
d080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
d090: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
d0a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
d0b0: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
d0c0: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
d0d0: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
d0e0: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
d0f0: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
d100: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
d110: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
d120: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
d130: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
d140: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
d150: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
d160: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
d170: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
d180: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
d190: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
d1a0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
d1b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d1c0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
d1d0: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
d1e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
d1f0: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
d200: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
d210: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d220: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d240: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
d250: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
d260: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
d270: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
d280: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
d290: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
d2a0: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
d2b0: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
d2c0: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
d2d0: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
d2e0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
d2f0: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
d300: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
d310: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
d320: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
d330: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
d340: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
d350: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
d360: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
d370: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
d380: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
d390: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
d3a0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
d3b0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d3c0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
d3d0: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
d3e0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
d3f0: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
d400: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d410: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d420: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
d430: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
d440: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
d450: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
d460: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
d470: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
d480: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
d490: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
d4a0: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
d4b0: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
d4c0: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
d4d0: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
d4e0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
d4f0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
d500: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
d520: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
d530: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
d540: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
d550: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
d560: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
d570: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
d580: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
d590: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
d5a0: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
d5b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d5c0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
d5d0: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  S.void sqlite3pa
d5e0: 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c  ger_set_safety_l
d5f0: 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
d600: 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a  er, int level){.
d610: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
d620: 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
d630: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
d640: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
d650: 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
d660: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
d670: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
d680: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
d690: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
d6a0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
d6b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d6c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
d6d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
d6e0: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
d6f0: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
d700: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
d710: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
d720: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d730: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
d740: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
d750: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20   only.  .*/.int 
d760: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
d770: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  _count = 0;../*.
d780: 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
d790: 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ary file.  Write
d7a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d7b0: 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65   file into zFile
d7c0: 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20  .** (zFile must 
d7d0: 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49  be at least SQLI
d7e0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
d7f0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57   bytes long.)  W
d800: 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  rite.** the file
d810: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
d820: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
d830: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
d840: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
d850: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
d860: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
d870: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
d880: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
d890: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
d8a0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
d8b0: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
d8c0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
d8d0: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
d8e0: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
d8f0: 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63  le *fd){.  int c
d900: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
d910: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
d920: 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
d930: 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
d940: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
d950: 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  only */.  do{.  
d960: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
d970: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
d980: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
d990: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
d9a0: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
d9b0: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
d9c0: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
d9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
d9e0: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
d9f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
da00: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
da10: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
da20: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
da30: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
da40: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
da50: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
da60: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
da70: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
da80: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
da90: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
daa0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
dab0: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
dac0: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
dad0: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
dae0: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
daf0: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
db00: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
db10: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
db20: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
db30: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
db40: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
db50: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
db60: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
db70: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
db80: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
db90: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
dba0: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
dbb0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
dbc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
dbd0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
dbe0: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
dbf0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
dc00: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
dc10: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
dc20: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
dc30: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
dc40: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
dc50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
dc60: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
dc70: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  te3pager_open(. 
dc80: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
dc90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
dca0: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
dcb0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
dcc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
dcd0: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
dce0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
dcf0: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
dd00: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd20: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
dd30: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
dd40: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
dd50: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
dd70: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
dd80: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
dd90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
dda0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
ddb0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
ddc0: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c  nameLen;.  OsFil
ddd0: 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  e fd;.  int rc =
dde0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
ddf0: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
de00: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
de10: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
de20: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
de30: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
de40: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
de50: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
de60: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
de70: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
de80: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
de90: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
dea0: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
deb0: 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50  E_SIZE];..  *ppP
dec0: 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  ager = 0;.  mems
ded0: 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f  et(&fd, 0, sizeo
dee0: 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71  f(fd));.  if( sq
def0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
df00: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
df10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
df20: 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e    }.  if( zFilen
df30: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
df40: 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  [0] ){.#ifndef S
df50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
df60: 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
df70: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
df80: 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
df90: 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
dfa0: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
dfb0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
dfc0: 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63  up("");.      rc
dfd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
dfe0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
dff0: 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c     {.      zFull
e000: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e010: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e020: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
e030: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
e040: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
e050: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e060: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
e070: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
e080: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
e090: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
e0a0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
e0b0: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
e0c0: 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  p(zTemp, &fd);. 
e0d0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
e0e0: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
e0f0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e100: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e110: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
e120: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e130: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
e140: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
e150: 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c 50   }.  if( !zFullP
e160: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73  athname ){.    s
e170: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
e180: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
e190: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e1a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e1b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
e1c0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
e1d0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e1e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e1f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e200: 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73   }.  nameLen = s
e210: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
e220: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  ame);.  pPager =
e230: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
e240: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
e250: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
e260: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  );.  if( pPager=
e270: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
e280: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
e290: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
e2a0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e2c0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41  NOMEM;.  }.  TRA
e2d0: 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
e2e0: 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
e2f0: 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  (fd), zFullPathn
e300: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ame);.  pPager->
e310: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
e320: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
e330: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e340: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
e350: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
e360: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
e370: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
e380: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
e390: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
e3a0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
e3b0: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
e3c0: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
e3d0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e3e0: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
e3f0: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  );.  for(i=nameL
e400: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
e410: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
e420: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
e430: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
e440: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
e450: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
e460: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
e470: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
e480: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
e490: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e4a0: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
e4b0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
e4c0: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
e4d0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
e4e0: 3d 20 66 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49  = fd;.#if OS_UNI
e4f0: 58 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 2e 70  X.  pPager->fd.p
e500: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
e510: 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
e520: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
e530: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ;.  pPager->useJ
e540: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
e550: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
e560: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
e570: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
e580: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
e590: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
e5a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e5b0: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
e5c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
e5d0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  0;.  pPager->dbS
e5e0: 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
e5f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e600: 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
e610: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
e620: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
e630: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e640: 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  stmtJSize = 0;. 
e650: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
e660: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d   0;.  pPager->nM
e670: 61 78 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  axPage = 0;.  pP
e680: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
e690: 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  00;.  pPager->st
e6a0: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
e6b0: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
e6c0: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
e6d0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
e6e0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
e6f0: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
e700: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
e710: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
e720: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
e730: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
e740: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
e750: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
e760: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
e770: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
e780: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
e790: 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
e7a0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
e7b0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
e7c0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
e7d0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
e7e0: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
e7f0: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
e800: 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50  NT(nExtra);.  pP
e810: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
e820: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
e830: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
e840: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
e850: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
e860: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
e870: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
e880: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
e890: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
e8a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e8b0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
e8c0: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
e8d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
e8e0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
e8f0: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
e900: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
e910: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
e920: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
e930: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
e940: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
e950: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
e960: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
e970: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
e980: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
e990: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
e9a0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
e9b0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
e9c0: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
e9d0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
e9e0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
e9f0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
ea00: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
ea10: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
ea20: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
ea30: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
ea40: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
ea50: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
ea60: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
ea70: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
ea80: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
ea90: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
eaa0: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
eab0: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
eac0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ead0: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
eae0: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
eaf0: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
eb00: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
eb10: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
eb20: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
eb30: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
eb40: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
eb50: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
eb60: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
eb70: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
eb80: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
eb90: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
eba0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
ebb0: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
ebc0: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
ebd0: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
ebe0: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
ebf0: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
ec00: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
ec10: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
ec20: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
ec30: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
ec40: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
ec50: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
ec60: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
ec70: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
ec80: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
ec90: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
eca0: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
ecb0: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
ecc0: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
ecd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ece0: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
ecf0: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
ed00: 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
ed10: 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
ed20: 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
ed30: 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
ed40: 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
ed50: 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
ed60: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
ed70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
ed80: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a  ager_set_pagesiz
ed90: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
eda0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
edb0: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
edc0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
edd0: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
ede0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
edf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
ee00: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
ee10: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
ee20: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
ee30: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
ee40: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ize;.}../*.** Th
ee50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 74 20  e following set 
ee60: 6f 66 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  of routines are 
ee70: 75 73 65 64 20 74 6f 20 64 69 73 61 62 6c 65 20  used to disable 
ee80: 74 68 65 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a  the simulated.**
ee90: 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65 63 68 61   I/O error mecha
eea0: 6e 69 73 6d 2e 20 20 54 68 65 73 65 20 72 6f 75  nism.  These rou
eeb0: 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
eec0: 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c 61 74 65  o avoid simulate
eed0: 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69 6e 20 70  d.** errors in p
eee0: 6c 61 63 65 73 20 77 68 65 72 65 20 77 65 20 64  laces where we d
eef0: 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
ef00: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 55   errors..**.** U
ef10: 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54 45 5f 54  nless -DSQLITE_T
ef20: 45 53 54 3d 31 20 69 73 20 75 73 65 64 2c 20 74  EST=1 is used, t
ef30: 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72  hese routines ar
ef40: 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a 2a 2a 20  e all no-ops.** 
ef50: 61 6e 64 20 67 65 6e 65 72 61 74 65 20 6e 6f 20  and generate no 
ef60: 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  code..*/.#ifdef 
ef70: 53 51 4c 49 54 45 5f 54 45 53 54 0a 65 78 74 65  SQLITE_TEST.exte
ef80: 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
ef90: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
efa0: 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
efb0: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74  te3_io_error_hit
efc0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
efd0: 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20 63 6c 65  ed_cnt;.void cle
efe0: 61 72 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  ar_simulated_io_
eff0: 65 72 72 6f 72 28 29 7b 0a 20 20 73 71 6c 69 74  error(){.  sqlit
f000: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20  e3_io_error_hit 
f010: 3d 20 30 3b 0a 7d 0a 76 6f 69 64 20 64 69 73 61  = 0;.}.void disa
f020: 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
f030: 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20  _errors(void){. 
f040: 20 73 61 76 65 64 5f 63 6e 74 20 3d 20 73 71 6c   saved_cnt = sql
f050: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
f060: 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74 65 33  nding;.  sqlite3
f070: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
f080: 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f 69 64 20 65  g = -1;.}.void e
f090: 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
f0a0: 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64 29 7b  io_errors(void){
f0b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
f0c0: 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 73 61  ror_pending = sa
f0d0: 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23 65 6c 73 65  ved_cnt;.}.#else
f0e0: 0a 23 20 64 65 66 69 6e 65 20 63 6c 65 61 72 5f  .# define clear_
f0f0: 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
f100: 6f 72 28 29 0a 23 20 64 65 66 69 6e 65 20 64 69  or().# define di
f110: 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
f120: 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
f130: 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
f140: 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
f150: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
f160: 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
f170: 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
f180: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
f190: 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
f1a0: 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
f1b0: 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e 6f 20 65  points to.  No e
f1c0: 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73  rror checking is
f1d0: 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   done..*/.void s
f1e0: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 61 64  qlite3pager_read
f1f0: 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61 67 65  _fileheader(Page
f200: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e  r *pPager, int N
f210: 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
f220: 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65  *pDest){.  memse
f230: 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
f240: 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29    if( MEMDB==0 )
f250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  {.    sqlite3OsS
f260: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
f270: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
f280: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
f290: 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20  fd, pDest, N);. 
f2a0: 20 20 20 63 6c 65 61 72 5f 73 69 6d 75 6c 61 74     clear_simulat
f2b0: 65 64 5f 69 6f 5f 65 72 72 6f 72 28 29 3b 0a 20  ed_io_error();. 
f2c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
f2d0: 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  rn the total num
f2e0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
f2f0: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73  the disk file as
f300: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
f310: 20 70 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20   pPager. .**.** 
f320: 49 66 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42  If the PENDING_B
f330: 59 54 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20  YTE lies on the 
f340: 70 61 67 65 20 64 69 72 65 63 74 6c 79 20 61 66  page directly af
f350: 74 65 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74  ter the end of t
f360: 68 65 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e  he.** file, then
f370: 20 63 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70   consider this p
f380: 61 67 65 20 70 61 72 74 20 6f 66 20 74 68 65 20  age part of the 
f390: 66 69 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78  file too. For ex
f3a0: 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e  ample, if.** PEN
f3b0: 44 49 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74  DING_BYTE is byt
f3c0: 65 20 34 30 39 36 20 28 74 68 65 20 66 69 72 73  e 4096 (the firs
f3d0: 74 20 62 79 74 65 20 6f 66 20 70 61 67 65 20 35  t byte of page 5
f3e0: 29 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  ) and the size o
f3f0: 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  f the.** file is
f400: 20 34 30 39 36 20 62 79 74 65 73 2c 20 35 20 69   4096 bytes, 5 i
f410: 73 20 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65  s returned inste
f420: 61 64 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20  ad of 4..*/.int 
f430: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
f440: 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
f450: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a  ager){.  i64 n;.
f460: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f470: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61  !=0 );.  if( pPa
f480: 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
f490: 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72  {.    n = pPager
f4a0: 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c  ->dbSize;.  } el
f4b0: 73 65 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  se {.    if( sql
f4c0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
f4d0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21  pPager->fd, &n)!
f4e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f4f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
f500: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
f510: 5f 44 49 53 4b 3b 0a 20 20 20 20 20 20 72 65 74  _DISK;.      ret
f520: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
f530: 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
f540: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
f550: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20  {.      n = 1;. 
f560: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f570: 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  n /= pPager->pag
f580: 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20  eSize;.    }.   
f590: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
f5a0: 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
f5b0: 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
f5c0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20  ->dbSize = n;.  
f5d0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d    }.  }.  if( n=
f5e0: 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  =(PENDING_BYTE/p
f5f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
f600: 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d   ){.    n++;.  }
f610: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
f620: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
f630: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
f640: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
f650: 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f  nal(Pager*);.../
f660: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
f670: 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
f680: 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
f690: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
f6a0: 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
f6b0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
f6c0: 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
f6d0: 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
f6e0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
f6f0: 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
f700: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76  sqlite3pager_mov
f710: 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
f720: 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
f730: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
f740: 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
f750: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
f760: 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
f770: 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
f780: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
f790: 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
f7a0: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
f7b0: 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
f7c0: 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
f7d0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
f7e0: 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  umber is zero, t
f7f0: 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73  hen this page is
f800: 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68   not in any hash
f810: 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72   chain. */.    r
f820: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
f830: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
f840: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
f850: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
f860: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
f870: 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
f880: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
f890: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f8a0: 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68  r->aHash[pager_h
f8b0: 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21  ash(pPg->pgno)]!
f8c0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
f8d0: 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
f8e0: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
f8f0: 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
f900: 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67  .    int h = pag
f910: 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e  er_hash(pPg->pgn
f920: 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
f930: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
f940: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
f950: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
f960: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
f970: 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f    }..  pPg->pgno
f980: 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
f990: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
f9a0: 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
f9b0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
f9c0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
f9d0: 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
f9e0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
f9f0: 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
fa00: 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
fa10: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
fa20: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
fa30: 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
fa40: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
fa50: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
fa60: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b  >pPager;..  /* K
fa70: 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79  eep the pFirstSy
fa80: 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  nced pointer poi
fa90: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72  nting at the fir
faa0: 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20  st synchronized 
fab0: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  page */.  if( pP
fac0: 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g==pPager->pFirs
fad0: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
fae0: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
faf0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68  NextFree;.    wh
fb00: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
fb10: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
fb20: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
fb30: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
fb40: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
fb50: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
fb60: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
fb70: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
fb80: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  vFree ){.    pPg
fb90: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
fba0: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
fbb0: 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  extFree;.  }else
fbc0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
fbd0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
fbe0: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
fbf0: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
fc00: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20  NextFree;.  }.  
fc10: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
fc20: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
fc30: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
fc40: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
fc50: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
fc60: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
fc70: 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
fc80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
fc90: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
fca0: 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ree;.  }.  pPg->
fcb0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
fcc0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
fcd0: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
fce0: 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
fcf0: 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e  table */.  unlin
fd00: 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
fd10: 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e  r, pPg);.}..#ifn
fd20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
fd30: 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54  MEMORYDB./*.** T
fd40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
fd50: 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  sed to truncate 
fd60: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
fd70: 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a  abase.  Delete.*
fd80: 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  * all pages whos
fd90: 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72  e pgno is larger
fda0: 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
fdb0: 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
fdc0: 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66  ferenced..** Ref
fdd0: 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
fde0: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
fdf0: 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
fe00: 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oed..*/.static v
fe10: 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  oid memoryTrunca
fe20: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
fe30: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
fe40: 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b  .  PgHdr **ppPg;
fe50: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20  .  int dbSize = 
fe60: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
fe70: 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65  .  ppPg = &pPage
fe80: 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65  r->pAll;.  while
fe90: 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21  ( (pPg = *ppPg)!
fea0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
feb0: 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20  g->pgno<=dbSize 
fec0: 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  ){.      ppPg = 
fed0: 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
fee0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
fef0: 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  g->nRef>0 ){.   
ff00: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
ff10: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
ff20: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ff30: 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d  e);.      ppPg =
ff40: 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
ff50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ff60: 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70    *ppPg = pPg->p
ff70: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75  NextAll;.      u
ff80: 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
ff90: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
ffa0: 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
ffb0: 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
ffc0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
ffd0: 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72  #define memoryTr
ffe0: 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66  uncate(p).#endif
fff0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
10000 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
10010 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20  a file.  Invoke 
10020 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
10030 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a  k if the lock.**
10040 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f   is currently no
10050 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65  t available.  Re
10060 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62  peat until the b
10070 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
10080 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
10090 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
100a0 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
100b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
100c0 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
100d0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
100e0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
100f0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
10100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
10110 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
10120 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
10130 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
10140 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
10150 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
10160 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
10170 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
10180 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
10190 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
101a0 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
101b0 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
101c0 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
101d0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
101e0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
101f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
10200 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  lse{.    do {.  
10210 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10220 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  OsLock(&pPager->
10230 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
10240 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
10250 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
10260 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
10270 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
10280 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
10290 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
102a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
102b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
102c0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ocktype;.    }. 
102d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
102e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
102f0 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68  e the file to th
10300 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10310 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a  s specified..*/.
10320 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10330 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
10340 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50  *pPager, Pgno nP
10350 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  age){.  int rc;.
10360 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70    sqlite3pager_p
10370 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
10380 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
10390 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
103a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
103b0 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
103c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
103d0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
103e0 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
103f0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
10400 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10410 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
10420 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
10430 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
10440 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
10450 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
10460 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10470 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63  .  }.  rc = sync
10480 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
10490 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
104a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
104b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
104c0 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   Get an exclusiv
104d0 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
104e0 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 72  tabase before tr
104f0 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72  uncating. */.  r
10500 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
10510 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
10520 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
10530 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10540 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
10550 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  n rc;.  }..  rc 
10560 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  = pager_truncate
10570 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b  (pPager, nPage);
10580 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10590 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
105a0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61  er->dbSize = nPa
105b0 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ge;.  }.  return
105c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68   rc;.}../*.** Sh
105d0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
105e0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
105f0 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
10600 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
10610 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
10620 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
10630 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
10640 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
10650 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
10660 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
10670 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
10680 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
10690 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
106a0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
106b0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
106c0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
106d0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
106e0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
106f0 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
10700 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
10710 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
10720 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
10730 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20  oredump..*/.int 
10740 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
10750 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
10760 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c  ){.  PgHdr *pPg,
10770 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63   *pNext;.  switc
10780 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  h( pPager->state
10790 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47   ){.    case PAG
107a0 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20  ER_RESERVED:.   
107b0 20 63 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43   case PAGER_SYNC
107c0 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41  ED: .    case PA
107d0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b  GER_EXCLUSIVE: {
107e0 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 69 67 6e  .      /* We ign
107f0 6f 72 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72  ore any IO error
10800 73 20 74 68 61 74 20 6f 63 63 75 72 20 64 75 72  s that occur dur
10810 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ing the rollback
10820 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74  .      ** operat
10830 69 6f 6e 2e 20 53 6f 20 64 69 73 61 62 6c 65 20  ion. So disable 
10840 49 4f 20 65 72 72 6f 72 20 73 69 6d 75 6c 61 74  IO error simulat
10850 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 65 73 74  ion so that test
10860 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72  ing.      ** wor
10870 6b 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 2e 0a  ks more easily..
10880 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
10890 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
108a0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
108b0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
108c0 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
108d0 29 3b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 5f  );.      enable_
108e0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
108f0 6f 72 73 28 29 3b 0a 20 20 20 20 20 20 69 66 28  ors();.      if(
10900 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
10910 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
10920 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
10930 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
10940 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
10950 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
10960 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
10970 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20  alOpen==0 );.   
10980 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10990 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53      case PAGER_S
109a0 48 41 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69  HARED: {.      i
109b0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
109c0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
109d0 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
109e0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
109f0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
10a00 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
10a10 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  lt: {.      /* D
10a20 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
10a30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
10a40 20 20 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50    }.  for(pPg=pP
10a50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
10a60 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66   pPg=pNext){.#if
10a70 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
10a80 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
10a90 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
10aa0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
10ab0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
10ac0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10ad0 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
10ae0 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
10af0 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
10b00 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
10b10 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
10b20 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
10b30 69 66 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  if.    pNext = p
10b40 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
10b50 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
10b60 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  );.  }.  TRACE2(
10b70 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41  "CLOSE %d\n", PA
10b80 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
10b90 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
10ba0 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 28 70 50  ->errMask || (pP
10bb0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
10bc0 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  n==0 && pPager->
10bd0 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a  stmtOpen==0) );.
10be0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
10bf0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
10c00 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
10c10 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
10c20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28   }.  sqliteFree(
10c30 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
10c40 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  al);.  if( pPage
10c50 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
10c60 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
10c70 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29  e(&pPager->stfd)
10c80 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
10c90 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
10ca0 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66  fd);.  /* Temp f
10cb0 69 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74  iles are automat
10cc0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62  ically deleted b
10cd0 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66  y the OS.  ** if
10ce0 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
10cf0 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c  le ){.  **   sql
10d00 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
10d10 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
10d20 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20  .  ** }.  */..  
10d30 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
10d40 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
10d50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
10d60 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
10d70 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
10d80 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
10d90 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
10da0 70 61 67 65 72 5f 70 61 67 65 6e 75 6d 62 65 72  pager_pagenumber
10db0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
10dc0 20 50 67 48 64 72 20 2a 70 20 3d 20 44 41 54 41   PgHdr *p = DATA
10dd0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
10de0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 67  ;.  return p->pg
10df0 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  no;.}../*.** The
10e00 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63   page_ref() func
10e10 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20  tion increments 
10e20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
10e30 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a  unt for a page..
10e40 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69  ** If the page i
10e50 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
10e60 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65  he freelist (the
10e70 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
10e80 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a   is zero) then.*
10e90 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d  * remove it from
10ea0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
10eb0 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73  *.** For non-tes
10ec0 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f  t systems, page_
10ed0 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f  ref() is a macro
10ee0 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67   that calls _pag
10ef0 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e  e_ref().** onlin
10f00 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  e of the referen
10f10 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
10f20 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74  .  For test syst
10f30 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a  ems, page_ref().
10f40 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e  ** is a real fun
10f50 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65  ction so that we
10f60 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f   can set breakpo
10f70 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69  ints and trace i
10f80 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
10f90 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64  d _page_ref(PgHd
10fa0 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  r *pPg){.  if( p
10fb0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
10fc0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69     /* The page i
10fd0 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74  s currently on t
10fe0 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
10ff0 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20  move it. */.    
11000 69 66 28 20 70 50 67 3d 3d 70 50 67 2d 3e 70 50  if( pPg==pPg->pP
11010 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
11020 65 64 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ed ){.      PgHd
11030 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
11040 74 46 72 65 65 3b 0a 20 20 20 20 20 20 77 68 69  tFree;.      whi
11050 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
11060 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
11070 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
11080 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
11090 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
110a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
110b0 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
110c0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
110d0 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
110e0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
110f0 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
11100 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
11110 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
11120 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 0a  NextFree;.    }.
11130 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
11140 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  xtFree ){.      
11150 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
11160 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
11170 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20  >pPrevFree;.    
11180 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
11190 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  ->pPager->pLast 
111a0 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
111b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
111c0 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b  >pPager->nRef++;
111d0 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66  .  }.  pPg->nRef
111e0 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  ++;.  REFINFO(pP
111f0 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c  g);.}.#ifdef SQL
11200 49 54 45 5f 44 45 42 55 47 0a 20 20 73 74 61 74  ITE_DEBUG.  stat
11210 69 63 20 76 6f 69 64 20 70 61 67 65 5f 72 65 66  ic void page_ref
11220 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
11230 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
11240 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f 70 61 67  =0 ){.      _pag
11250 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  e_ref(pPg);.    
11260 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
11270 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
11280 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20  REFINFO(pPg);.  
11290 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 0a 23 20    }.  }.#else.# 
112a0 64 65 66 69 6e 65 20 70 61 67 65 5f 72 65 66 28  define page_ref(
112b0 50 29 20 20 20 28 28 50 29 2d 3e 6e 52 65 66 3d  P)   ((P)->nRef=
112c0 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28 50 29 3a  =0?_page_ref(P):
112d0 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52 65 66 2b  (void)(P)->nRef+
112e0 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  +).#endif../*.**
112f0 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
11300 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
11310 6f 72 20 61 20 70 61 67 65 2e 20 20 54 68 65 20  or a page.  The 
11320 69 6e 70 75 74 20 70 6f 69 6e 74 65 72 20 69 73  input pointer is
11330 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63 65 20  .** a reference 
11340 74 6f 20 74 68 65 20 70 61 67 65 20 64 61 74 61  to the page data
11350 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11360 70 61 67 65 72 5f 72 65 66 28 76 6f 69 64 20 2a  pager_ref(void *
11370 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
11380 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
11390 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 70  GHDR(pData);.  p
113a0 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
113b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
113c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
113d0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e  the journal.  In
113e0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 61   other words, ma
113f0 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65 20  ke sure all the 
11400 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
11410 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ** been written 
11420 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  to the journal h
11430 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61  ave actually rea
11440 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63 65  ched the surface
11450 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b 2e   of the.** disk.
11460 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61 66 65    It is not safe
11470 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 6f   to modify the o
11480 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
11490 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66 74 65   file until afte
114a0 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r.** the journal
114b0 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
114c0 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e  .  If the origin
114d0 61 6c 20 64 61 74 61 62 61 73 65 20 69 73 20 6d  al database is m
114e0 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65 0a 2a  odified before.*
114f0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
11500 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20 70 6f   synced and a po
11510 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
11520 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63 65 64  rs, the unsynced
11530 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61 74 61   journal.** data
11540 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74 20 61   would be lost a
11550 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65 20 75  nd we would be u
11560 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c 65 74  nable to complet
11570 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65  ely rollback the
11580 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 68 61  .** database cha
11590 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73 65 20  nges.  Database 
115a0 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75 6c 64  corruption would
115b0 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54   occur..** .** T
115c0 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
115d0 20 75 70 64 61 74 65 73 20 74 68 65 20 6e 52 65   updates the nRe
115e0 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 68  c field in the h
115f0 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a 6f 75  eader of the jou
11600 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20 63 6f  rnal..** (See co
11610 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  mments on the pa
11620 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72  ger_playback() r
11630 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64 69 74  outine for addit
11640 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
11650 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20 73 79  n.).** If the sy
11660 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c 4c 2c  nc mode is FULL,
11670 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c 6c 20   two syncs will 
11680 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20 74 68  occur.  First th
11690 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a  e whole journal.
116a0 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20 74 68  ** is synced, th
116b0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
116c0 64 20 69 73 20 75 70 64 61 74 65 64 2c 20 74 68  d is updated, th
116d0 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79 6e 63  en a second sync
116e0 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46   occurs..**.** F
116f0 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
11700 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20 6e 6f  abases, we do no
11710 74 20 63 61 72 65 20 69 66 20 77 65 20 61 72 65  t care if we are
11720 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
11730 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70 6f 77  k.** after a pow
11740 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f 20 73  er failure, so s
11750 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
11760 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
11770 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79  lears the needSy
11780 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72  nc field of ever
11790 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68  y page current h
117a0 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79  eld in.** memory
117b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
117c0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65  syncJournal(Page
117d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
117e0 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
117f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11800 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
11810 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
11820 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
11830 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
11840 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
11850 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
11860 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
11870 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
11880 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
11890 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
118a0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
118b0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
118c0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
118d0 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 2f  lOpen );.      /
118e0 2a 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65  * assert( !pPage
118f0 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20  r->noSync ); // 
11900 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20  noSync might be 
11910 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f  set if synchrono
11920 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20  us.      ** was 
11930 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72  turned off after
11940 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11950 20 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54   was started.  T
11960 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69  icket #615 */.#i
11970 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
11980 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20     {.        /* 
11990 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50  Make sure the pP
119a0 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74  ager->nRec count
119b0 65 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e  er we are keepin
119c0 67 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20  g agrees.       
119d0 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65   ** with the nRe
119e0 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
119f0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
11a00 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
11a10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11a20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20   i64 jSz;.      
11a30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11a40 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
11a50 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20  ->jfd, &jSz);.  
11a60 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
11a70 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
11a80 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
11a90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
11aa0 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a  =jSz );.      }.
11ab0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
11ac0 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
11ad0 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69  the nRec value i
11ae0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
11af0 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20  file header. If 
11b00 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  in.        ** fu
11b10 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  ll-synchronous m
11b20 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f  ode, sync the jo
11b30 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69  urnal first. Thi
11b40 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20  s ensures that. 
11b50 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61         ** all da
11b60 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69  ta has really hi
11b70 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72  t the disk befor
11b80 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65  e nRec is update
11b90 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20  d to mark.      
11ba0 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e    ** it as a can
11bb0 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62  didate for rollb
11bc0 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f  ack. .        */
11bd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
11be0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
11bf0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
11c00 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20  2("SYNC journal 
11c10 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  of %d\n", PAGERI
11c20 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
11c30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11c40 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  e3OsSync(&pPager
11c50 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20  ->jfd, 0);.     
11c60 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
11c70 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11c80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63      }.        rc
11c90 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
11ca0 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20  (&pPager->jfd,. 
11cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cc0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
11cd0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
11ce0 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
11cf0 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69  gic));.        i
11d00 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
11d10 63 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  c;.        rc = 
11d20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
11d30 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11d40 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20  ->nRec);.       
11d50 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
11d60 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63   rc;..        rc
11d70 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
11d80 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
11d90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11da0 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
11db0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
11dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
11dd0 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
11de0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
11df0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
11e00 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11e10 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d  3OsSync(&pPager-
11e20 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75  >jfd, pPager->fu
11e30 6c 6c 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 69  llSync);.      i
11e40 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
11e50 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61 67  n rc;.      pPag
11e60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
11e70 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
11e80 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
11e90 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
11ea0 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53 79  Erase the needSy
11eb0 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76 65  nc flag from eve
11ec0 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  ry page..    */.
11ed0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
11ee0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
11ef0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
11f00 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  ){.      pPg->ne
11f10 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
11f20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  }.    pPager->pF
11f30 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
11f40 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 7d  ger->pFirst;.  }
11f50 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
11f60 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
11f70 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
11f80 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
11f90 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
11fa0 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
11fb0 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
11fc0 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
11fd0 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
11fe0 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
11ff0 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
12000 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
12010 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
12020 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
12030 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
12040 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
12050 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
12060 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
12070 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
12080 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
12090 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
120a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
120b0 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69  /*.** Given a li
120c0 73 74 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e  st of pages (con
120d0 6e 65 63 74 65 64 20 62 79 20 74 68 65 20 50 67  nected by the Pg
120e0 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74  Hdr.pDirty point
120f0 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65  er) write.** eve
12100 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20  ry one of those 
12110 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65  pages out to the
12120 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
12130 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c  nd mark them all
12140 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f  .** as clean..*/
12150 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
12160 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
12170 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
12180 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
12190 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
121a0 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
121b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
121c0 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
121d0 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
121e0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
121f0 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
12200 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
12210 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
12220 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
12230 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
12240 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
12250 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
12260 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
12270 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
12280 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
12290 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
122a0 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
122b0 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
122c0 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
122d0 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
122e0 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
122f0 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
12300 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
12310 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
12320 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
12330 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
12340 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
12350 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
12360 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
12370 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
12380 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
12390 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
123a0 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
123b0 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
123c0 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
123d0 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
123e0 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
123f0 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
12400 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
12410 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
12420 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
12430 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
12440 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
12450 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
12460 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
12470 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
12480 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
12490 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
124a0 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
124b0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
124c0 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
124d0 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
124e0 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
124f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
12500 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
12510 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
12520 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
12530 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
12540 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
12550 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
12560 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
12570 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
12580 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12590 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
125a0 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  n rc;.  }..  whi
125b0 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20  le( pList ){.   
125c0 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
125d0 64 69 72 74 79 20 29 3b 0a 20 20 20 20 72 63 20  dirty );.    rc 
125e0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
125f0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c  &pPager->fd, (pL
12600 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
12610 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
12620 7a 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ze);.    if( rc 
12630 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
12640 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
12650 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
12660 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
12670 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
12680 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
12690 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
126a0 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
126b0 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63  lite3pager_trunc
126c0 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ate() was called
126d0 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20   to.    ** make 
126e0 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72  the file smaller
126f0 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20   (presumably by 
12700 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65  auto-vacuum code
12710 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a  ). Do not write.
12720 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20      ** any such 
12730 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c  pages to the fil
12740 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
12750 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70  ( pList->pgno<=p
12760 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
12770 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
12780 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
12790 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
127a0 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20  ->pgno, 6);.    
127b0 20 20 54 52 41 43 45 33 28 22 53 54 4f 52 45 20    TRACE3("STORE 
127c0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
127d0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
127e0 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pList->pgno);.  
127f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12800 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
12810 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
12820 54 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67 65  TA(pList), pPage
12830 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
12840 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
12850 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
12860 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
12870 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 54  gno, 0);.      T
12880 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
12890 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20 20 7d 0a  >nWrite);.    }.
128a0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
128b0 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54     else{.      T
128c0 52 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25  RACE3("NOSTORE %
128d0 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
128e0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
128f0 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
12900 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66   }.#endif.    if
12910 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
12920 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72  ;.    pList->dir
12930 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
12940 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
12950 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67  S.    pList->pag
12960 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
12970 67 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23  gehash(pList);.#
12980 65 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20  endif.    pList 
12990 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b  = pList->pDirty;
129a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
129b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
129c0 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20  * Collect every 
129d0 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20  dirty page into 
129e0 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64  a dirty list and
129f0 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69  .** return a poi
12a00 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61 64  nter to the head
12a10 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20   of that list.  
12a20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a  All pages are.**
12a30 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20   collected even 
12a40 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69 6c  if they are stil
12a50 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  l in use..*/.sta
12a60 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
12a70 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
12a80 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61 67  ages(Pager *pPag
12a90 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c  er){.  PgHdr *p,
12aa0 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74   *pList;.  pList
12ab0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50   = 0;.  for(p=pP
12ac0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
12ad0 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
12ae0 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20     if( p->dirty 
12af0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72  ){.      p->pDir
12b00 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20  ty = pList;.    
12b10 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20    pList = p;.   
12b20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
12b30 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
12b40 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
12b50 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a 6f  here is a hot jo
12b60 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67 69 76  urnal on the giv
12b70 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68  en pager..** A h
12b80 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e  ot journal is on
12b90 65 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20  e that needs to 
12ba0 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  be played back..
12bb0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72  **.** If the cur
12bc0 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
12bd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
12be0 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61  s 0 but a journa
12bf0 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73  l file.** exists
12c00 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62 61 62  , that is probab
12c10 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ly an old journa
12c20 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72 6f 6d  l left over from
12c30 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61   a prior.** data
12c40 62 61 73 65 20 77 69 74 68 20 74 68 65 20 73 61  base with the sa
12c50 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64  me name.  Just d
12c60 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
12c70 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
12c80 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
12c90 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12ca0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73   if( !pPager->us
12cb0 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72  eJournal ) retur
12cc0 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
12cd0 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
12ce0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
12cf0 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
12d00 69 66 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65  if( sqlite3OsChe
12d10 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26  ckReservedLock(&
12d20 70 50 61 67 65 72 2d 3e 66 64 29 20 29 20 72 65  pPager->fd) ) re
12d30 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
12d40 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
12d50 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20  ount(pPager)==0 
12d60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
12d70 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
12d80 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 72 65  Journal);.    re
12d90 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
12da0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
12db0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75   }.}../*.** Acqu
12dc0 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ire a page..**.*
12dd0 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  * A read lock on
12de0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69   the disk file i
12df0 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20  s obtained when 
12e00 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 69  the first page i
12e10 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20  s acquired. .** 
12e20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69  This read lock i
12e30 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74  s dropped when t
12e40 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  he last page is 
12e50 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20  released..**.** 
12e60 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72  A _get works for
12e70 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72   any page number
12e80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e   greater than 0.
12e90 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
12ea0 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61  e.** file is sma
12eb0 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  ller than the re
12ec0 71 75 65 73 74 65 64 20 70 61 67 65 2c 20 74 68  quested page, th
12ed0 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73  en no actual dis
12ee0 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73  k.** read occurs
12ef0 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20   and the memory 
12f00 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70 61 67  image of the pag
12f10 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
12f20 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73   to.** all zeros
12f30 2e 20 20 54 68 65 20 65 78 74 72 61 20 64 61 74  .  The extra dat
12f40 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20  a appended to a 
12f50 70 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69  page is always i
12f60 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f  nitialized.** to
12f70 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72 73 74   zeros the first
12f80 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
12f90 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
12fa0 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63  ry..**.** The ac
12fb0 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20  quisition might 
12fc0 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c  fail for several
12fd0 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c   reasons.  In al
12fe0 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61  l cases,.** an a
12ff0 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
13000 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
13010 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73  d and *ppPage is
13020 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a   set to NULL..**
13030 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
13040 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  ite3pager_lookup
13050 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72  ().  Both this r
13060 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b  outine and _look
13070 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20  up() attempt.** 
13080 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 69  to find a page i
13090 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
130a0 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49 66  cache first.  If
130b0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
130c0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d   already.** in m
130d0 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74  emory, this rout
130e0 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b  ine goes to disk
130f0 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77   to read it in w
13100 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29  hereas _lookup()
13110 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
13120 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
13130 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
13140 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
13150 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
13160 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
13170 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
13180 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
13190 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
131a0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f  ry..** Since _lo
131b0 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
131c0 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
131d0 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
131e0 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
131f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
13200 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
13210 67 65 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70  ger_get(Pager *p
13220 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
13230 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29  , void **ppPage)
13240 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
13250 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
13260 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
13270 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
13280 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
13290 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
132a0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
132b0 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
132c0 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
132d0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
132e0 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
132f0 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
13300 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
13310 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
13320 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13330 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
13340 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
13350 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
13360 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
13370 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
13380 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
13390 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
133a0 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
133b0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
133c0 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
133d0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
133e0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
133f0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
13400 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
13410 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
13420 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
13430 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
13440 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13450 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
13460 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
13470 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20  0 && !MEMDB ){. 
13480 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
13490 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
134a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
134b0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
134c0 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
134d0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
134e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
134f0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
13510 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
13520 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
13530 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
13540 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
13550 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
13560 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
13570 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
13580 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
13590 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
135a0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73    */.    if( has
135b0 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
135c0 72 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74  r) ){.       int
135d0 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20   rc;..       /* 
135e0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
135f0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13600 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
13610 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
13620 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
13630 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
13640 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
13650 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
13660 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
13670 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
13680 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
13690 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
136a0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
136b0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
136c0 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
136d0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
136e0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
136f0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
13700 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
13710 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
13720 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
13730 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
13740 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61  it .       ** ba
13750 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20  ck..       ** . 
13760 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
13770 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
13780 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
13790 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
137a0 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  , the.       ** 
137b0 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
137c0 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
137d0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
137e0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
137f0 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
13800 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  t's own EXCLUSIV
13810 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
13820 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
13830 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
13840 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
13850 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  (&pPager->fd, EX
13860 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
13870 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13880 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13890 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
138a0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
138b0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
138c0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
138d0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
138e0 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
138f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20  n rc;.       }. 
13900 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
13910 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
13920 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f  USIVE;..       /
13930 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
13940 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  al for reading o
13950 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  nly.  Return SQL
13960 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
13970 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
13980 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
13990 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
139a0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
139b0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
139c0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
139d0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
139e0 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
139f0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
13a00 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
13a10 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
13a20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
13a30 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61  olds.       ** a
13a40 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
13a50 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
13a60 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
13a70 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
13a80 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65  ** processes ope
13a90 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
13aa0 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
13ab0 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
13ac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13ad0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70  OsOpenReadOnly(p
13ae0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
13af0 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
13b00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
13b10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13b20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
13b30 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
13b40 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
13b50 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
13b60 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
13b70 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
13b80 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
13b90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13ba0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13bb0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
13bc0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
13bd0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
13be0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13bf0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
13c00 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
13c10 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
13c20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
13c30 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  dr = 0;..       
13c40 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
13c50 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
13c60 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
13c70 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
13c80 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
13c90 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
13ca0 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
13cb0 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70  */.       rc = p
13cc0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
13cd0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66  ager);.       if
13ce0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13cf0 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  ){.         retu
13d00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a  rn rc;.       }.
13d10 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
13d20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
13d30 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61  /* Search for pa
13d40 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ge in cache */. 
13d50 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
13d60 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
13d70 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  no);.    if( MEM
13d80 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  DB && pPager->st
13d90 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
13da0 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
13db0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
13dc0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
13dd0 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
13de0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
13df0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
13e00 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
13e10 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
13e20 74 20 68 3b 0a 20 20 20 20 54 45 53 54 5f 49 4e  t h;.    TEST_IN
13e30 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73  CR(pPager->nMiss
13e40 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
13e50 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
13e60 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
13e70 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
13e80 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
13e90 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
13ea0 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
13eb0 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
13ec0 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
13ed0 20 2b 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   + pPager->pageS
13ee0 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f00 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
13f10 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
13f20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
13f40 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
13f50 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
13f60 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
13f70 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
13f80 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
13f90 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
13fa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13fb0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
13fc0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
13fd0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
13fe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
13ff0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  DB ){.        me
14000 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
14010 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
14020 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
14030 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a  tory));.      }.
14040 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
14050 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
14060 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
14070 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
14080 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
14090 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
140a0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
140b0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
140c0 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67 65 72 2d  r->nPage>pPager-
140d0 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a 20 20 20  >nMaxPage ){.   
140e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
140f0 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 3d 3d 28  ger->nMaxPage==(
14100 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 31 29  pPager->nPage-1)
14110 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
14120 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b 2b 3b 0a  er->nMaxPage++;.
14130 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
14140 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64  e{.      /* Find
14150 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
14160 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
14170 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
14180 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a  oes not.      **
14190 20 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64   require us to d
141a0 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20  o an fsync() on 
141b0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  the journal..   
141c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20     */.      pPg 
141d0 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
141e0 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f  Synced;..      /
141f0 2a 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f  * If we could no
14200 74 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68  t find a page th
14210 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
14220 69 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20  ire an fsync(). 
14230 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a       ** on the j
14240 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
14250 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
14260 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
14270 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72  s a.      ** ver
14280 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e  y slow operation
14290 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72  , so we work har
142a0 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20  d to avoid it.  
142b0 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20  But sometimes.  
142c0 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20      ** it can't 
142d0 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20  be helped..     
142e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
142f0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
14300 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  int rc = syncJou
14310 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
14320 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
14330 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
14340 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
14350 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
14360 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14370 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
14380 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
14390 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
143a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
143b0 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
143c0 63 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20  c mode, write a 
143d0 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  new journal head
143e0 65 72 20 69 6e 74 6f 20 74 68 65 0a 09 20 20 2a  er into the..  *
143f0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
14400 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20  This is done to 
14410 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66  avoid ever modif
14420 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 09  ying a journal..
14430 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74    ** header that
14440 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20   is involved in 
14450 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20  the rollback of 
14460 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a  pages that have.
14470 09 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65  .  ** already be
14480 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
14490 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63  e database (in c
144a0 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69  ase the header i
144b0 73 0a 09 20 20 2a 2a 20 74 72 61 73 68 65 64 20  s..  ** trashed 
144c0 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
144d0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
144e0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
144f0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14500 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
14510 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
14520 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e  er->journalOff >
14530 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0 );.          
14540 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
14550 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
14560 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
14570 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
14580 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
14590 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
145a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
145b0 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
145c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
145d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
145e0 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
145f0 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rst;.      }.   
14600 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
14610 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  nRef==0 );..    
14620 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70    /* Write the p
14630 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
14640 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69  ase file if it i
14650 73 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a  s dirty..      *
14660 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  /.      if( pPg-
14670 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
14680 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
14690 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  eedSync==0 );.  
146a0 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74        pPg->pDirt
146b0 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  y = 0;.        r
146c0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
146d0 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b  pagelist( pPg );
146e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
146f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14700 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
14710 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
14720 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
14730 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
14740 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
14750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
14760 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
14770 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  ==0 );..      /*
14780 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20   If the page we 
14790 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73  are recycling is
147a0 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
147b0 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a  sRollback, then.
147c0 20 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65        ** set the
147d0 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
147e0 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
147f0 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
14800 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f        ** sqlite_
14810 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
14820 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
14830 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
14840 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
14850 20 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65       ** It is ne
14860 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68  cessary to do th
14870 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70  is because the p
14880 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79  age marked alway
14890 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20  sRollback.      
148a0 2a 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f  ** might be relo
148b0 61 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20  aded at a later 
148c0 74 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74  time but at that
148d0 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20   point we won't 
148e0 72 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a  remember.      *
148f0 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61  * that is was ma
14900 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62  rked alwaysRollb
14910 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  ack.  This means
14920 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20   that all pages 
14930 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65  must.      ** be
14940 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
14950 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
14960 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20  ere on out..    
14970 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
14980 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
14990 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  ck ){.        pP
149a0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
149b0 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  back = 1;.      
149c0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69  }..      /* Unli
149d0 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
149e0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
149f0 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
14a00 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20  table.      */. 
14a10 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
14a20 70 50 67 29 3b 0a 20 20 20 20 20 20 54 45 53 54  pPg);.      TEST
14a30 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4f  _INCR(pPager->nO
14a40 76 66 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  vfl);.    }.    
14a50 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
14a60 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
14a70 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
14a80 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
14a90 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
14aa0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
14ab0 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
14ac0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
14ad0 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73  no/8);.      ass
14ae0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
14af0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
14b00 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
14b10 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
14b20 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
14b30 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
14b40 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
14b50 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
14b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
14b70 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
14b80 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
14b90 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
14ba0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14bb0 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  >aInStmt && (int
14bc0 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
14bd0 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20  tmtSize.        
14be0 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
14bf0 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d  >aInStmt[pgno/8]
14c00 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
14c10 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  )!=0 ){.      pa
14c20 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
14c30 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ist(pPg);.    }e
14c40 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  lse{.      page_
14c50 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
14c60 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
14c70 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  }.    pPg->dirty
14c80 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 0;.    pPg->n
14c90 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
14ca0 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70  INFO(pPg);.    p
14cb0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
14cc0 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73     h = pager_has
14cd0 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67  h(pgno);.    pPg
14ce0 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
14cf0 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
14d00 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
14d10 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
14d20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
14d30 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
14d40 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
14d50 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
14d60 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
14d70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
14d80 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
14d90 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14da0 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
14db0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
14dc0 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
14dd0 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
14de0 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
14df0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14e00 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
14e10 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
14e20 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f  r_unref(PGHDR_TO
14e30 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20  _DATA(pPg));.   
14e40 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
14e50 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
14e60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
14e70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
14e80 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
14e90 6f 75 6e 74 28 70 50 61 67 65 72 29 3c 28 69 6e  ount(pPager)<(in
14ea0 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  t)pgno ){.      
14eb0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
14ec0 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
14ed0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14ee0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14ef0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20    int rc;.      
14f00 61 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30  assert( MEMDB==0
14f10 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   );.      rc = s
14f20 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
14f30 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d  ager->fd, (pgno-
14f40 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
14f50 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14f60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14f70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
14f80 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
14f90 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47  (&pPager->fd, PG
14fa0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
14fb0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
14fc0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
14fd0 20 20 20 54 52 41 43 45 33 28 22 46 45 54 43 48     TRACE3("FETCH
14fe0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
14ff0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
15000 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
15010 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
15020 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
15030 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
15040 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  3);.      if( rc
15050 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
15060 20 20 20 20 20 20 20 69 36 34 20 66 69 6c 65 53         i64 fileS
15070 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
15080 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
15090 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26  ze(&pPager->fd,&
150a0 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54  fileSize)!=SQLIT
150b0 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
150c0 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e      || fileSize>
150d0 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61  =pgno*pPager->pa
150e0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
150f0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
15100 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
15110 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
15120 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
15130 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15140 20 20 20 20 20 20 20 20 20 20 63 6c 65 61 72 5f            clear_
15150 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
15160 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  or();.          
15170 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
15180 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
15190 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
151a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
151b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
151c0 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72  TEST_INCR(pPager
151d0 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 20 20 20 20  ->nRead);.      
151e0 7d 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  }.    }.#ifdef S
151f0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
15200 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48  S.    pPg->pageH
15210 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
15220 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
15230 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  f.  }else{.    /
15240 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
15250 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20 70  page is in the p
15260 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  age cache. */.  
15270 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
15280 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70  er->nHit);.    p
15290 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
152a0 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47  }.  *ppPage = PG
152b0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
152c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
152d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
152e0 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
152f0 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
15300 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
15310 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
15320 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
15330 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
15340 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
15350 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
15360 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
15370 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
15380 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
15390 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
153a0 2e 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  .  The differenc
153b0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72  e between this r
153c0 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71  outine.** and sq
153d0 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
153e0 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29 20   is that _get() 
153f0 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64  will go to the d
15400 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20  isk and read.** 
15410 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
15420 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
15430 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e  lready in cache.
15440 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
15450 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69  * returns NULL i
15460 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
15470 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66  t in cache or if
15480 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f   a disk I/O erro
15490 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68  r .** has ever h
154a0 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  appened..*/.void
154b0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c   *sqlite3pager_l
154c0 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
154d0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
154e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
154f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15500 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
15510 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66   pgno!=0 );.  if
15520 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
15530 6b 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f  k & ~(PAGER_ERR_
15540 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74  FULL) ){.    ret
15550 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  urn 0;.  }.  pPg
15560 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
15570 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
15580 20 69 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65   if( pPg==0 ) re
15590 74 75 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72  turn 0;.  page_r
155a0 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
155b0 6e 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  n PGHDR_TO_DATA(
155c0 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pPg);.}../*.** R
155d0 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a  elease a page..*
155e0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62  *.** If the numb
155f0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
15600 20 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f   to the page dro
15610 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20  p to zero, then 
15620 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61  the.** page is a
15630 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20  dded to the LRU 
15640 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20  list.  When all 
15650 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c  references to al
15660 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72  l pages.** are r
15670 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62  eleased, a rollb
15680 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ack occurs and t
15690 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  he lock on the d
156a0 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65  atabase is.** re
156b0 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  moved..*/.int sq
156c0 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
156d0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
156e0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
156f0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
15700 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
15710 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20   for this page. 
15720 20 2a 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41   */.  pPg = DATA
15730 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
15740 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
15750 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67  >nRef>0 );.  pPg
15760 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49  ->nRef--;.  REFI
15770 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48 45  NFO(pPg);..  CHE
15780 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20  CK_PAGE(pPg);.. 
15790 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
157a0 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
157b0 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61 63  s to a page reac
157c0 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20  h 0, call the.  
157d0 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e  ** destructor an
157e0 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20 74  d add the page t
157f0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  o the freelist..
15800 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e    */.  if( pPg->
15810 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50  nRef==0 ){.    P
15820 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
15830 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e    pPager = pPg->
15840 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67 2d  pPager;.    pPg-
15850 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b 0a  >pNextFree = 0;.
15860 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
15870 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61  ee = pPager->pLa
15880 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  st;.    pPager->
15890 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  pLast = pPg;.   
158a0 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
158b0 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67  ree ){.      pPg
158c0 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
158d0 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20 20  xtFree = pPg;.  
158e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
158f0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
15900 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
15910 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
15920 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 70  ==0 && pPager->p
15930 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20 29  FirstSynced==0 )
15940 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
15950 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
15960 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  Pg;.    }.    if
15970 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72  ( pPager->xDestr
15980 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70  uctor ){.      p
15990 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
159a0 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
159b0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
159c0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
159d0 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
159e0 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
159f0 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
15a00 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
15a10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15a20 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
15a30 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
15a40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
15a50 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
15a60 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
15a70 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b  ==0 && !MEMDB ){
15a80 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73  .      pager_res
15a90 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
15aa0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
15ab0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
15ac0 2a 2a 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72  ** Create a jour
15ad0 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61  nal file for pPa
15ae0 67 65 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75  ger.  There shou
15af0 6c 64 20 61 6c 72 65 61 64 79 20 62 65 20 61 20  ld already be a 
15b00 52 45 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45  RESERVED.** or E
15b10 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
15b20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
15b30 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  le when this rou
15b40 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
15b50 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
15b60 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
15b70 68 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e  hing.  Return an
15b80 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
15b90 72 65 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77  release the.** w
15ba0 72 69 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79  rite lock if any
15bb0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
15bc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15bd0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
15be0 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
15bf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
15c00 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
15c10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
15c20 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
15c30 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
15c40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
15c50 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
15c60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15c70 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
15c80 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15c90 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
15ca0 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  );.  sqlite3page
15cb0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
15cc0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  er);.  pPager->a
15cd0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
15ce0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
15cf0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
15d00 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
15d10 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b  aInJournal==0 ){
15d20 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
15d30 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f  _NOMEM;.    goto
15d40 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
15d50 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72  journal;.  }.  r
15d60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
15d70 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67 65  nExclusive(pPage
15d80 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50  r->zJournal, &pP
15d90 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72  ager->jfd,pPager
15da0 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70  ->tempFile);.  p
15db0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15dc0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
15dd0 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
15de0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15df0 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  lHdr = 0;.  if( 
15e00 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15e10 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
15e20 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
15e30 3b 0a 20 20 7d 0a 20 20 53 45 54 5f 46 55 4c 4c  ;.  }.  SET_FULL
15e40 53 59 4e 43 28 70 50 61 67 65 72 2d 3e 6a 66 64  SYNC(pPager->jfd
15e50 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  , pPager->fullSy
15e60 6e 63 29 3b 0a 20 20 53 45 54 5f 46 55 4c 4c 53  nc);.  SET_FULLS
15e70 59 4e 43 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  YNC(pPager->fd, 
15e80 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
15e90 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70  );.  sqlite3OsOp
15ea0 65 6e 44 69 72 65 63 74 6f 72 79 28 70 50 61 67  enDirectory(pPag
15eb0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
15ec0 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
15ed0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
15ee0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
15ef0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
15f00 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
15f10 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
15f20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
15f30 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
15f40 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
15f50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
15f60 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
15f70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
15f80 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
15f90 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
15fa0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
15fb0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69   }.  pPager->ori
15fc0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
15fd0 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20  ->dbSize;..  rc 
15fe0 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64  = writeJournalHd
15ff0 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66  r(pPager);..  if
16000 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75  ( pPager->stmtAu
16010 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51  toopen && rc==SQ
16020 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
16030 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
16040 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50 61 67  _stmt_begin(pPag
16050 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  er);.  }.  if( r
16060 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
16070 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
16080 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
16090 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
160a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
160b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
160c0 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ULL;.    }.  }. 
160d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69   return rc;..fai
160e0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
160f0 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46 72 65  nal:.  sqliteFre
16100 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  e(pPager->aInJou
16110 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d  rnal);.  pPager-
16120 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  >aInJournal = 0;
16130 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  .  sqlite3OsUnlo
16140 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
16150 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67  NO_LOCK);.  pPag
16160 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
16170 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 72 65 74 75  R_UNLOCK;.  retu
16180 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16190 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d  Acquire a write-
161a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
161b0 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20  base.  The lock 
161c0 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a  is removed when.
161d0 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68  ** the any of th
161e0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70  e following happ
161f0 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73  en:.**.**   *  s
16200 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
16210 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  it() is called..
16220 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
16230 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
16240 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
16250 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
16260 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  close() is calle
16270 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
16280 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 20  e3pager_unref() 
16290 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20  is called to on 
162a0 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e  every outstandin
162b0 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  g page..**.** Th
162c0 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65  e first paramete
162d0 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  r to this routin
162e0 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
162f0 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20  o any open page 
16300 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
16310 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e  se file.  Nothin
16320 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20  g changes about 
16330 74 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73  the page - it is
16340 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a   used merely to.
16350 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69  ** acquire a poi
16360 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65  nter to the Page
16370 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20  r structure and 
16380 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68  as proof that th
16390 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64  ere is.** alread
163a0 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  y a read-lock on
163b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
163c0 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
163d0 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61  parameter indica
163e0 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61  tes how much spa
163f0 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72  ce in bytes to r
16400 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20  eserve for a.** 
16410 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
16420 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20  ile-name at the 
16430 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75  start of the jou
16440 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20  rnal when it is 
16450 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  created..**.** A
16460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
16470 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20   opened if this 
16480 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61  is not a tempora
16490 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65  ry file.  For te
164a0 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73  mporary.** files
164b0 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66  , the opening of
164c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
164d0 65 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  e is deferred un
164e0 74 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a  til there is an.
164f0 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  ** actual need t
16500 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  o write to the j
16510 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
16520 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16530 20 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65   already reserve
16540 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74  d for writing, t
16550 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
16560 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66   no-op..**.** If
16570 20 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c   exFlag is true,
16580 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65   go ahead and ge
16590 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
165a0 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
165b0 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69  ** immediately i
165c0 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e  nstead of waitin
165d0 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74  g until we try t
165e0 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68  o flush the cach
165f0 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61  e.  The.** exFla
16600 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20  g is ignored if 
16610 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
16620 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e   already active.
16630 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
16640 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69 64 20  ager_begin(void 
16650 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78 46 6c  *pData, int exFl
16660 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ag){.  PgHdr *pP
16670 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
16680 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
16690 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
166a0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
166b0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
166c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
166d0 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ef>0 );.  assert
166e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
166f0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
16700 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
16710 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
16720 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ED ){.    assert
16730 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
16740 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69  rnal==0 );.    i
16750 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
16760 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16770 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
16780 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  E;.      pPager-
16790 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
167a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
167b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
167c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
167d0 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  k(&pPager->fd, R
167e0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
167f0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
16800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16810 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
16820 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  = PAGER_RESERVED
16830 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65 78  ;.        if( ex
16840 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Flag ){.        
16850 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
16860 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
16870 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
16880 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
16890 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72     }.      if( r
168a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
168b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
168c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
168d0 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
168e0 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 54  che = 0;.      T
168f0 52 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49  RACE2("TRANSACTI
16900 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ON %d\n", PAGERI
16910 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
16920 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73    if( pPager->us
16930 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61  eJournal && !pPa
16940 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
16950 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
16960 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
16970 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
16980 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
16990 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
169a0 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61  * Mark a data pa
169b0 67 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e  ge as writeable.
169c0 20 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72    The page is wr
169d0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
169e0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74  ournal .** if it
169f0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
16a00 72 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75  ready.  This rou
16a10 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c  tine must be cal
16a20 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e  led before makin
16a30 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20  g.** changes to 
16a40 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  a page..**.** Th
16a50 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69  e first time thi
16a60 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
16a70 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63  led, the pager c
16a80 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20  reates a new.** 
16a90 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75  journal and acqu
16aa0 69 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20  ires a RESERVED 
16ab0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
16ac0 62 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45  base.  If the RE
16ad0 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63  SERVED.** lock c
16ae0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75  ould not be acqu
16af0 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69  ired, this routi
16b00 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
16b10 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20  E_BUSY.  The.** 
16b20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20  calling routine 
16b30 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74  must check for t
16b40 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65  hat return value
16b50 20 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20   and be careful 
16b60 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65  not to.** change
16b70 20 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75   any page data u
16b80 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  ntil this routin
16b90 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
16ba0 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
16bb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  e journal file c
16bc0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74  ould not be writ
16bd0 74 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20  ten because the 
16be0 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a  disk is full,.**
16bf0 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
16c00 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
16c10 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20  E_FULL and does 
16c20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c  an immediate rol
16c30 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75  lback..** All su
16c40 62 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61  bsequent write a
16c50 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74  ttempts also ret
16c60 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
16c70 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69  until there.** i
16c80 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  s a call to sqli
16c90 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
16ca0 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61 67 65  ) or sqlite3page
16cb0 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a  r_rollback() to.
16cc0 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74  ** reset..*/.int
16cd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
16ce0 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ite(void *pData)
16cf0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
16d00 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
16d10 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
16d20 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
16d30 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
16d40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
16d50 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f  * Check for erro
16d60 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  rs.  */.  if( pP
16d70 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b  ager->errMask ){
16d80 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67   .    return pag
16d90 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
16da0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  r);.  }.  if( pP
16db0 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ager->readOnly )
16dc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16dd0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20  ITE_PERM;.  }.. 
16de0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
16df0 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a  ->setMaster );..
16e00 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
16e10 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
16e20 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
16e30 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
16e40 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
16e50 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
16e60 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
16e70 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
16e80 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
16e90 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
16ea0 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
16eb0 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
16ec0 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
16ed0 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
16ee0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
16ef0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
16f00 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
16f10 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
16f20 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
16f30 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
16f40 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
16f50 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
16f60 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
16f70 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
16f80 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
16f90 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
16fa0 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
16fb0 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
16fc0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16fd0 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
16fe0 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
16ff0 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
17000 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
17010 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
17020 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
17030 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
17040 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
17050 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20  n(pData, 0);.   
17060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
17080 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
17090 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
170a0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
170b0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
170c0 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
170d0 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
170e0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
170f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
17100 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
17110 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
17120 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17130 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
17140 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
17150 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17160 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
17170 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
17180 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
17190 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
171a0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
171b0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
171c0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
171d0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
171e0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
171f0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
17200 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
17210 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
17220 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
17230 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
17240 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
17250 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
17260 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
17270 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
17280 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
17290 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
172a0 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
172b0 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
172c0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
172d0 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
172e0 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
172f0 20 20 20 20 20 20 20 20 75 33 32 20 73 61 76 65          u32 save
17300 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  d;.        if( M
17310 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
17320 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
17330 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
17340 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
17350 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
17360 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  3("JOURNAL %d pa
17370 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
17380 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
17390 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
173a0 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
173b0 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20  pOrig==0 );.    
173c0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
173d0 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ig = sqliteMallo
173e0 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
173f0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
17400 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
17410 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
17420 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
17430 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54  ->pOrig, PGHDR_T
17440 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
17450 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
17460 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
17470 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
17480 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
17490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
174a0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69  should never wri
174b0 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  te to the journa
174c0 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20  l file the page 
174d0 74 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a  that.          *
174e0 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64  * contains the d
174f0 61 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20  atabase locks.  
17500 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
17510 73 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20  sert verifies.  
17520 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
17530 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20  we do not. */.  
17540 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17550 70 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52  pPg->pgno!=PAGER
17560 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
17570 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f   );.          CO
17580 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
17590 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
175a0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
175b0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
175c0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
175d0 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  o, pData);.     
175e0 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
175f0 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
17600 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  RA(pPg, pPager);
17610 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
17620 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
17630 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
17640 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
17650 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
17660 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
17670 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
17680 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
17690 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -4);.          
176a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
176b0 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
176c0 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61  , &((char*)pData
176d0 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20  )[-4], szPg);.  
176e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
176f0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
17700 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  Pg;.          TR
17710 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
17720 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
17730 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
17740 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
17750 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
17760 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
17770 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
17780 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
17790 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
177a0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   0);.          *
177b0 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
177c0 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
177d0 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20  ) = saved;.     
177e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
177f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17800 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
17810 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
17820 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
17830 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
17840 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
17850 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL;.            
17860 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
17870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
17880 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
17890 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
178a0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
178b0 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
178c0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
178d0 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
178e0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
178f0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
17900 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
17910 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
17920 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  Sync;.          
17930 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
17940 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
17950 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
17960 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
17970 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
17980 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
17990 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
179a0 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
179b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
179c0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
179d0 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
179e0 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
179f0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
17a00 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
17a10 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52  Sync;.        TR
17a20 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
17a30 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
17a40 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
17a50 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
17a60 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
17a70 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
17a80 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
17a90 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
17aa0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
17ab0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
17ac0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
17ad0 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
17ae0 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
17af0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
17b00 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
17b10 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
17b20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
17b30 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
17b40 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
17b50 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
17b60 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
17b70 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
17b80 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
17b90 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
17ba0 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
17bb0 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
17bc0 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
17bd0 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
17be0 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
17bf0 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
17c00 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
17c10 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
17c20 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
17c30 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
17c40 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
17c50 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ze ){.      asse
17c60 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
17c70 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
17c80 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
17c90 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
17ca0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
17cb0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
17cc0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
17cd0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
17ce0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
17cf0 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
17d00 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
17d10 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
17d20 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
17d30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17d40 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
17d50 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
17d60 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
17d70 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
17d80 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
17d90 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
17da0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
17db0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
17dc0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
17dd0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
17de0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
17df0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
17e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
17e10 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
17e20 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
17e30 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
17e40 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
17e50 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
17e60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17e70 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
17e80 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61  stfd,((char*)pDa
17e90 74 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70  ta)-4, pPager->p
17ea0 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
17eb0 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
17ec0 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
17ed0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
17ee0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
17ef0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  no);.        COD
17f00 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
17f10 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
17f20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
17f30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17f40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
17f50 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
17f60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
17f70 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
17f80 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
17f90 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
17fa0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
17fb0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
17fc0 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
17fd0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
17fe0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
17ff0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
18000 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
18010 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
18020 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
18030 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
18040 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
18050 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
18060 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
18070 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
18080 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
18090 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
180a0 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
180b0 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
180c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
180d0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
180e0 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
180f0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
18100 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
18110 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
18120 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
18130 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
18140 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18150 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
18160 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
18170 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
18180 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
18190 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
181a0 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
181b0 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
181c0 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
181d0 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
181e0 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
181f0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
18200 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
18210 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
18220 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
18230 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
18240 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
18250 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
18260 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23  pPg->dirty;.}..#
18270 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18280 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
18290 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
182a0 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
182b0 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
182c0 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
182d0 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
182e0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
182f0 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74  e3pager_overwrit
18300 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
18310 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
18320 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64   *pData){.  void
18330 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72   *pPage;.  int r
18340 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
18350 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
18360 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  er, pgno, &pPage
18370 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
18380 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
18390 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
183a0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
183b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
183c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
183d0 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61  cpy(pPage, pData
183e0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
183f0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
18400 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
18410 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  f(pPage);.  }.  
18420 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
18430 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
18440 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
18450 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
18460 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
18470 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
18480 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
18490 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22  mation on page "
184a0 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68  pgno" back to th
184b0 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
184c0 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
184d0 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
184e0 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
184f0 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
18500 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
18510 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
18520 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
18530 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
18540 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
18550 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
18560 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
18570 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
18580 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
18590 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
185a0 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
185b0 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
185c0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
185d0 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
185e0 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
185f0 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
18600 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
18610 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
18620 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
18630 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
18640 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
18650 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
18660 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
18670 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
18680 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
18690 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
186a0 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
186b0 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
186c0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
186d0 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
186e0 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
186f0 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
18700 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
18710 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
18720 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
18730 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
18740 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
18750 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
18760 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
18770 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
18780 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
18790 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
187a0 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
187b0 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
187c0 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
187d0 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
187e0 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
187f0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
18800 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
18810 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
18820 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
18830 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18840 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
18850 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f  eused,.** the do
18860 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  nt_rollback() ro
18870 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
18880 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
18890 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a  e page contains.
188a0 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ** critical data
188b0 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
188c0 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
188d0 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ts rolled back i
188e0 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68  n spite.** of th
188f0 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
18900 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
18910 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
18920 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  t_write(Pager *p
18930 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
18940 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
18950 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
18960 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d  return;..  pPg =
18970 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
18980 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
18990 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
189a0 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
189b0 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
189c0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
189d0 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
189e0 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
189f0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
18a00 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
18a10 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
18a20 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
18a30 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
18a40 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
18a50 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
18a60 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
18a70 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
18a80 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
18a90 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
18aa0 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
18ab0 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
18ac0 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
18ad0 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
18ae0 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
18af0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
18b00 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
18b10 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
18b20 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
18b30 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
18b40 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
18b50 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
18b60 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
18b70 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
18b80 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
18b90 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
18ba0 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
18bb0 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
18bc0 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
18bd0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
18be0 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
18bf0 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
18c00 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
18c10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41  }else{.      TRA
18c20 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
18c30 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
18c40 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  , pgno, PAGERID(
18c50 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
18c60 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
18c70 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
18c80 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
18c90 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
18ca0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
18cb0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
18cc0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  }.  }.}../*.** A
18cd0 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
18ce0 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
18cf0 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20  pager that if a 
18d00 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c  rollback occurs,
18d10 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  .** it is not ne
18d20 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f  cessary to resto
18d30 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74  re the data on t
18d40 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20  he given page.  
18d50 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  This.** means th
18d60 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65  at the pager doe
18d70 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65  s not have to re
18d80 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70  cord the given p
18d90 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f  age in the.** ro
18da0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a  llback journal..
18db0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
18dc0 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
18dd0 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ck(void *pData){
18de0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
18df0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
18e00 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
18e10 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
18e20 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  ger;..  if( pPag
18e30 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
18e40 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50  _EXCLUSIVE || pP
18e50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18e60 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  n==0 ) return;. 
18e70 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73   if( pPg->always
18e80 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67  Rollback || pPag
18e90 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
18ea0 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65  ck || MEMDB ) re
18eb0 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67  turn;.  if( !pPg
18ec0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
18ed0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
18ee0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18ef0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
18f00 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
18f10 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
18f20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
18f30 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
18f40 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
18f50 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e  &7);.    pPg->in
18f60 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
18f70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
18f80 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
18f90 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
18fa0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
18fb0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
18fc0 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64  ;.      page_add
18fd0 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
18fe0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52  g);.    }.    TR
18ff0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
19000 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
19010 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
19020 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19030 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
19040 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
19050 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
19060 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
19070 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
19080 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
19090 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
190a0 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   || (int)pPg->pg
190b0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  no>pPager->origD
190c0 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73  bSize );.    ass
190d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
190e0 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70  Stmt!=0 );.    p
190f0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
19100 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
19110 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
19120 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f  .    page_add_to
19130 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
19140 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  .  }.}...#ifndef
19150 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
19160 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ORYDB./*.** Clea
19170 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c  r a PgHistory bl
19180 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ock.*/.static vo
19190 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  id clearHistory(
191a0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
191b0 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  ){.  sqliteFree(
191c0 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20  pHist->pOrig);. 
191d0 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
191e0 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
191f0 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
19200 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
19210 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  0;.}.#else.#defi
19220 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  ne clearHistory(
19230 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
19240 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e   Commit all chan
19250 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
19260 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ase and release 
19270 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a  the write lock..
19280 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d  **.** If the com
19290 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e  mit fails for an
192a0 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c  y reason, a roll
192b0 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20  back attempt is 
192c0 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65  made.** and an e
192d0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
192e0 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63  urned.  If the c
192f0 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51  ommit worked, SQ
19300 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
19310 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
19320 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
19330 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
19340 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
19350 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
19360 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
19370 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  k==PAGER_ERR_FUL
19380 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  L ){.    rc = sq
19390 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
193a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
193b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
193c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
193d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20   SQLITE_FULL;.  
193e0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
193f0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  c;.  }.  if( pPa
19400 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
19410 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
19420 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
19430 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
19440 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
19450 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
19460 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
19470 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
19480 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  ROR;.  }.  TRACE
19490 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  2("COMMIT %d\n",
194a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
194b0 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
194c0 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  {.    pPg = page
194d0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
194e0 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
194f0 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b     while( pPg ){
19500 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
19510 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53  ory(PGHDR_TO_HIS
19520 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b  T(pPg, pPager));
19530 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
19540 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
19550 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
19560 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
19570 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
19580 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
19590 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
195a0 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70  0;.      pPg = p
195b0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
195c0 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  }.#ifndef NDEBUG
195d0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
195e0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
195f0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
19600 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
19610 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
19620 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
19630 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
19640 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
19650 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
19660 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
19670 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
19680 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
19690 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
196a0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50   }.#endif.    pP
196b0 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
196c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
196d0 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
196e0 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
196f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
19700 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  f( pPager->dirty
19710 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Cache==0 ){.    
19720 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77  /* Exit early (w
19730 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65  ithout doing the
19740 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20   time-consuming 
19750 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20  sqlite3OsSync() 
19760 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66  calls).    ** if
19770 20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e   there have been
19780 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74   no changes to t
19790 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
197a0 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
197b0 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
197c0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  c==0 );.    rc =
197d0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
197e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
197f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
19800 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   -1;.    return 
19810 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
19820 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
19830 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
19840 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e  sqlite3pager_syn
19850 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b  c(pPager, 0, 0);
19860 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19870 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
19880 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20   commit_abort;. 
19890 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f   }.  rc = pager_
198a0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
198b0 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  er);.  pPager->d
198c0 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65  bSize = -1;.  re
198d0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
198e0 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74  ump here if anyt
198f0 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
19900 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
19910 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  t process..  */.
19920 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20  commit_abort:.  
19930 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
19940 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
19950 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19960 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
19970 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
19980 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
19990 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
199a0 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
199b0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
199c0 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
199d0 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
199e0 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
199f0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
19a00 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
19a10 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
19a20 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
19a30 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
19a40 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
19a50 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
19a60 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
19a70 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54  col (SQLITE_PROT
19a80 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20  OCOL) or unless 
19a90 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72  some other.** pr
19aa0 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67  ocess is writing
19ab0 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20   trash into the 
19ac0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51  journal file (SQ
19ad0 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72  LITE_CORRUPT) or
19ae0 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69  .** unless a pri
19af0 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c  or malloc() fail
19b00 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ed (SQLITE_NOMEM
19b10 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20  ).  Appropriate 
19b20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61  error.** codes a
19b30 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20  re returned for 
19b40 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69  all these occasi
19b50 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c  ons.  Otherwise,
19b60 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
19b70 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
19b80 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
19b90 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
19ba0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
19bb0 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c  ;.  TRACE2("ROLL
19bc0 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45  BACK %d\n", PAGE
19bd0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
19be0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
19bf0 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66   PgHdr *p;.    f
19c00 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
19c10 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
19c20 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
19c30 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20  story *pHist;.  
19c40 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e      assert( !p->
19c50 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
19c60 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  ;.      if( !p->
19c70 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
19c80 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
19c90 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
19ca0 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
19cb0 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  )->pOrig );.    
19cc0 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
19cd0 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
19ce0 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
19cf0 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  er))->pStmt );. 
19d00 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
19d10 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
19d20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
19d30 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
19d40 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73  ;.      if( pHis
19d50 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
19d60 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
19d70 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69  _TO_DATA(p), pHi
19d80 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65  st->pOrig, pPage
19d90 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19da0 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52 4f        TRACE3("RO
19db0 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f  LLBACK-PAGE %d o
19dc0 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  f %d\n", p->pgno
19dd0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19de0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
19df0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
19e00 22 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61  "PAGE %d is clea
19e10 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  n on %d\n", p->p
19e20 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
19e30 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ger));.      }. 
19e40 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
19e50 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20  y(pHist);.      
19e60 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  p->dirty = 0;.  
19e70 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c      p->inJournal
19e80 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
19e90 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
19ea0 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20   p->pPrevStmt = 
19eb0 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  p->pNextStmt = 0
19ec0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ;..      if( pPa
19ed0 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
19ee0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
19ef0 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
19f00 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50  R_TO_DATA(p), pP
19f10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
19f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
19f30 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
19f40 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
19f50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
19f60 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
19f70 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Size;.    memory
19f80 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
19f90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
19fa0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
19fb0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
19fc0 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
19fd0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19fe0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  _OK;.  }..  if( 
19ff0 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61  !pPager->dirtyCa
1a000 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  che || !pPager->
1a010 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1a020 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
1a030 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
1a040 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
1a050 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20  bSize = -1;.    
1a060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
1a070 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1a080 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67  rMask!=0 && pPag
1a090 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47  er->errMask!=PAG
1a0a0 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20  ER_ERR_FULL ){. 
1a0b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
1a0c0 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
1a0d0 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70  USIVE ){.      p
1a0e0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
1a0f0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
1a100 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1a110 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
1a120 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
1a130 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45  >state==PAGER_RE
1a140 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e  SERVED ){.    in
1a150 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20  t rc2;.    rc = 
1a160 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
1a170 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
1a180 72 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72  rc2 = pager_unwr
1a190 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
1a1a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1a1b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1a1c0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a  rc = rc2;.    }.
1a1d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1a1e0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
1a1f0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1a200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a210 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  K ){.    rc = SQ
1a220 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1a230 54 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  T;.    pPager->e
1a240 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
1a250 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
1a260 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
1a270 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
1a280 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1a290 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1a2a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a2b0 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
1a2c0 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
1a2d0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
1a2e0 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
1a2f0 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
1a300 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1a310 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
1a320 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
1a330 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
1a340 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
1a350 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a360 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
1a370 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
1a380 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
1a390 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
1a3a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a3b0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
1a3c0 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  1];.  a[0] = pPa
1a3d0 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
1a3e0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
1a3f0 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
1a400 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
1a410 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
1a420 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
1a430 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
1a440 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
1a450 72 4d 61 73 6b 3b 0a 23 69 66 64 65 66 20 53 51  rMask;.#ifdef SQ
1a460 4c 49 54 45 5f 54 45 53 54 0a 20 20 61 5b 36 5d  LITE_TEST.  a[6]
1a470 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
1a480 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
1a490 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
1a4a0 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
1a4b0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
1a4c0 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
1a4d0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
1a4e0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  e;.#endif.  retu
1a4f0 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rn a;.}../*.** S
1a500 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
1a510 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
1a520 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1a530 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
1a540 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
1a550 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
1a560 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
1a570 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
1a580 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
1a590 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
1a5a0 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
1a5b0 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
1a5c0 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
1a5d0 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
1a5e0 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
1a5f0 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1a600 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
1a610 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  in(Pager *pPager
1a620 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1a630 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45  har zTemp[SQLITE
1a640 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
1a650 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
1a660 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b  er->stmtInUse );
1a670 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a680 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a  r->dbSize>=0 );.
1a690 20 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 42    TRACE2("STMT-B
1a6a0 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  EGIN %d\n", PAGE
1a6b0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1a6c0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1a6d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
1a6e0 73 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  se = 1;.    pPag
1a6f0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
1a700 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
1a710 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a720 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
1a730 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a740 70 65 6e 20 29 7b 0a 20 20 20 20 70 50 61 67 65  pen ){.    pPage
1a750 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1a760 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1a770 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1a780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1a790 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
1a7a0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1a7b0 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
1a7c0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
1a7d0 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
1a7e0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d  pPager->aInStmt=
1a7f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1a800 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d  3OsLock(&pPager-
1a810 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
1a820 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1a830 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
1a840 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
1a850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
1a860 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
1a870 3e 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73  >jfd, &pPager->s
1a880 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28  tmtJSize);.  if(
1a890 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
1a8a0 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
1a8b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a8c0 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61  stmtJSize == pPa
1a8d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
1a8e0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67  );.#endif.  pPag
1a8f0 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
1a900 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a910 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ff;.  pPager->st
1a920 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  mtSize = pPager-
1a930 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  >dbSize;.  pPage
1a940 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
1a950 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  0;.  pPager->stm
1a960 74 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d  tCksum = pPager-
1a970 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66  >cksumInit;.  if
1a980 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  ( !pPager->stmtO
1a990 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
1a9a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
1a9b0 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50  ntemp(zTemp, &pP
1a9c0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
1a9d0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
1a9e0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
1a9f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
1aa00 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  mtOpen = 1;.    
1aa10 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
1aa20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
1aa30 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1aa40 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  1;.  return SQLI
1aa50 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65  TE_OK;. .stmt_be
1aa60 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66  gin_failed:.  if
1aa70 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
1aa80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  t ){.    sqliteF
1aa90 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  ree(pPager->aInS
1aaa0 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
1aab0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
1aac0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1aad0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
1aae0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
1aaf0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1ab00 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67  _stmt_commit(Pag
1ab10 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
1ab20 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
1ab30 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67 48 64  nUse ){.    PgHd
1ab40 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
1ab50 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
1ab60 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  -COMMIT %d\n", P
1ab70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1ab80 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1ab90 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1aba0 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
1abb0 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  stfd, 0);.      
1abc0 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
1abd0 63 61 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74  cate(&pPager->st
1abe0 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20  fd, 0); */.     
1abf0 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
1ac00 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a  ger->aInStmt );.
1ac10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
1ac20 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
1ac30 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
1ac40 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b  ger->pStmt; pPg;
1ac50 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
1ac60 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
1ac70 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 20 20 20  pNextStmt;.     
1ac80 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
1ac90 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1aca0 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  g->inStmt = 0;. 
1acb0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53       pPg->pPrevS
1acc0 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
1acd0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1ace0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1acf0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1ad00 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1ad10 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1ad20 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
1ad30 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1ad40 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48  tmt);.        pH
1ad50 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
1ad60 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1ad70 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
1ad80 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ec = 0;.    pPag
1ad90 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
1ada0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  0;.    pPager->p
1adb0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
1adc0 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
1add0 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75  open = 0;.  retu
1ade0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1adf0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
1ae00 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
1ae10 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
1ae20 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50  _stmt_rollback(P
1ae30 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1ae40 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
1ae50 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1ae60 20 29 7b 0a 20 20 20 20 54 52 41 43 45 32 28 22   ){.    TRACE2("
1ae70 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64  STMT-ROLLBACK %d
1ae80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1ae90 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d  ger));.    if( M
1aea0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
1aeb0 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20  Hdr *pPg;.      
1aec0 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
1aed0 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d  pStmt; pPg; pPg=
1aee0 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b  pPg->pNextStmt){
1aef0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
1af00 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
1af10 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
1af20 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1af30 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
1af40 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1af50 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
1af60 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
1af70 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
1af80 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1af90 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1afa0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1afb0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
1afc0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
1afd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1afe0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
1aff0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
1b000 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72  ize;.      memor
1b010 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
1b020 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
1b030 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1b040 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
1b050 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
1b060 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1b070 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  }.    sqlite3pag
1b080 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
1b090 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b  Pager);.  }else{
1b0a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1b0b0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  _OK;.  }.  pPage
1b0c0 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20  r->stmtAutoopen 
1b0d0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
1b0e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b0f0 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
1b100 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1b110 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  ase file..*/.con
1b120 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1b130 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50  pager_filename(P
1b140 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b150 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b160 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
1b170 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
1b180 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65 20  irectory of the 
1b190 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
1b1a0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1b1b0 6c 69 74 65 33 70 61 67 65 72 5f 64 69 72 6e 61  lite3pager_dirna
1b1c0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1b1d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1b1e0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
1b1f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1b200 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
1b210 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
1b220 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1b230 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1b240 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50  er_journalname(P
1b250 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1b260 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b270 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a  zJournal;.}../*.
1b280 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1b290 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20  f fsync() calls 
1b2a0 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72  are disabled for
1b2b0 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65   this pager.  Re
1b2c0 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66  turn FALSE.** if
1b2d0 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78   fsync()s are ex
1b2e0 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e  ecuted normally.
1b2f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1b300 61 67 65 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65  ager_nosync(Page
1b310 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1b320 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
1b330 79 6e 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  ync;.}../*.** Se
1b340 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20  t the codec for 
1b350 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f  this pager.*/.vo
1b360 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
1b370 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67  set_codec(.  Pag
1b380 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
1b390 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  id (*xCodec)(voi
1b3a0 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
1b3b0 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
1b3c0 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
1b3d0 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
1b3e0 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
1b3f0 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
1b400 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Arg;.}../*.** Th
1b410 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1b420 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e  lled to incremen
1b430 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1b440 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
1b450 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74  er,.** stored at
1b460 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20   byte 24 of the 
1b470 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73  pager file..*/.s
1b480 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
1b490 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
1b4a0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1b4b0 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65  ){.  void *pPage
1b4c0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48 64  ;.  PgHdr *pPgHd
1b4d0 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f  r;.  u32 change_
1b4e0 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72  counter;.  int r
1b4f0 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61  c;..  /* Open pa
1b500 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65  ge 1 of the file
1b510 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f   for writing. */
1b520 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
1b530 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1b540 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69   1, &pPage);.  i
1b550 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b560 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b570 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1b580 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
1b590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b5a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b5b0 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
1b5c0 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74  current value at
1b5d0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70   byte 24. */.  p
1b5e0 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f  PgHdr = DATA_TO_
1b5f0 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20  PGHDR(pPage);.  
1b600 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d  change_counter =
1b610 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73 28   retrieve32bits(
1b620 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20  pPgHdr, 24);..  
1b630 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
1b640 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
1b650 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
1b660 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
1b670 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  /.  change_count
1b680 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62  er++;.  store32b
1b690 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74  its(change_count
1b6a0 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b  er, pPgHdr, 24);
1b6b0 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74  ..  /* Release t
1b6c0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  he page referenc
1b6d0 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70  e. */.  sqlite3p
1b6e0 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
1b6f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
1b700 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1b710 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
1b720 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70  e file for the p
1b730 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61  ager pPager. zMa
1b740 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74  ster points to t
1b750 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20  he name.** of a 
1b760 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
1b770 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ile that should 
1b780 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
1b790 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a  the individual.*
1b7a0 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
1b7b0 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e  zMaster may be N
1b7c0 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e  ULL, which is in
1b7d0 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20  terpreted as no 
1b7e0 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
1b7f0 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61  l (a single data
1b800 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
1b810 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  )..**.** This ro
1b820 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68  utine ensures th
1b830 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  at the journal i
1b840 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69  s synced, all di
1b850 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65  rty pages writte
1b860 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61  n.** to the data
1b870 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68  base file and th
1b880 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b890 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79  synced. The only
1b8a0 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72   thing that.** r
1b8b0 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74  emains to commit
1b8c0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b8d0 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
1b8e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
1b8f0 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75  or.** master jou
1b900 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65  rnal file if spe
1b910 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e  cified)..**.** N
1b920 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73  ote that if zMas
1b930 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20  ter==NULL, this 
1b940 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69  does not overwri
1b950 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61  te a previous va
1b960 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f  lue.** passed to
1b970 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72   an sqlite3pager
1b980 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a  _sync() call..**
1b990 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72  .** If parameter
1b9a0 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a   nTrunc is non-z
1b9b0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61  ero, then the pa
1b9c0 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ger file is trun
1b9d0 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75  cated to.** nTru
1b9e0 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69  nc pages (this i
1b9f0 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76  s used by auto-v
1ba00 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29  acuum databases)
1ba10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ba20 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72  pager_sync(Pager
1ba30 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
1ba40 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50  char *zMaster, P
1ba50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69  gno nTrunc){.  i
1ba60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1ba70 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41  K;..  TRACE4("DA
1ba80 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c  TABASE SYNC: Fil
1ba90 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20  e=%s zMaster=%s 
1baa0 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20  nTrunc=%d\n", . 
1bab0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69       pPager->zFi
1bac0 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c  lename, zMaster,
1bad0 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20   nTrunc);..  /* 
1bae0 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  If this is an in
1baf0 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e  -memory db, or n
1bb00 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65  o pages have bee
1bb10 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72  n written to, or
1bb20 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
1bb30 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20  ion has already 
1bb40 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20  been called, it 
1bb50 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f  is a no-op..  */
1bb60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1bb70 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43  tate!=PAGER_SYNC
1bb80 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20  ED && !MEMDB && 
1bb90 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
1bba0 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  he ){.    PgHdr 
1bbb0 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74  *pPg;.    assert
1bbc0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1bbd0 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a  lOpen );..    /*
1bbe0 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
1bbf0 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68  rnal file name h
1bc00 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1bc10 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20  written to the. 
1bc20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
1bc30 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63  le, then no sync
1bc40 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54 68   is required. Th
1bc50 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1bc60 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69  it is.    ** wri
1bc70 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70  tten, then the p
1bc80 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20  rocess fails to 
1bc90 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52  upgrade from a R
1bca0 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20  ESERVED to an.  
1bcb0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1bcc0 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69  ock. The next ti
1bcd0 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  me the process t
1bce0 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ries to commit t
1bcf0 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
1bd00 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61  ction the m-j na
1bd10 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72  me will have alr
1bd20 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
1bd30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
1bd40 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  ( !pPager->setMa
1bd50 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63  ster ){.      rc
1bd60 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
1bd70 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
1bd80 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1bd90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1bda0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23  oto sync_exit;.#
1bdb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1bdc0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1bdd0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1bde0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
1bdf0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
1be00 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
1be10 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
1be20 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
1be30 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69  s.        ** bei
1be40 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
1be50 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
1be60 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
1be70 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
1be80 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
1be90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1bea0 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
1beb0 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1bec0 20 20 20 20 20 20 20 69 6e 74 20 69 53 6b 69 70         int iSkip
1bed0 20 3d 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f   = PAGER_MJ_PGNO
1bee0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1bef0 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
1bf00 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
1bf10 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
1bf20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1bf30 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1bf40 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28  nal[i/8] & (1<<(
1bf50 69 26 37 29 29 29 20 26 26 20 69 21 3d 69 53 6b  i&7))) && i!=iSk
1bf60 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
1bf70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1bf80 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
1bf90 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  i, &pPage);.    
1bfa0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1bfb0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1bfc0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1bfd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1bfe0 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1bff0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
1c000 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1c010 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20  _unref(pPage);. 
1c020 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
1c030 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1c040 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1c050 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1c060 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65     } .      }.#e
1c070 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d 20  ndif.      rc = 
1c080 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
1c090 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74  al(pPager, zMast
1c0a0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1c0b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1c0c0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1c0d0 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f       rc = syncJo
1c0e0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1c0f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c100 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1c110 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a  nc_exit;.    }..
1c120 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1c130 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1c140 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
1c150 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1c160 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
1c170 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72  cate(pPager, nTr
1c180 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20  unc);.      if( 
1c190 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1c1a0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1c1b0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1c1c0 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64    /* Write all d
1c1d0 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68  irty pages to th
1c1e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1c1f0 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67  */.    pPg = pag
1c200 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79  er_get_all_dirty
1c210 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a  _pages(pPager);.
1c220 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
1c230 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50  rite_pagelist(pP
1c240 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  g);.    if( rc!=
1c250 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1c260 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20   sync_exit;..   
1c270 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74   /* Sync the dat
1c280 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
1c290 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
1c2a0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
1c2b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
1c2c0 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  nc(&pPager->fd, 
1c2d0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  0);.    }..    p
1c2e0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
1c2f0 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d  AGER_SYNCED;.  }
1c300 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72  ..sync_exit:.  r
1c310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
1c320 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c330 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a  _AUTOVACUUM./*.*
1c340 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20  * Move the page 
1c350 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44  identified by pD
1c360 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20  ata to location 
1c370 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65  pgno in the file
1c380 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d  . .**.** There m
1c390 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65  ust be no refere
1c3a0 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72  nces to the curr
1c3b0 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49  ent page pgno. I
1c3c0 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a  f current page.*
1c3d0 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  * pgno is not al
1c3e0 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c  ready in the rol
1c3f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
1c400 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e  t is not written
1c410 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20   there by.** by 
1c420 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68  this routine. Th
1c430 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74  e same applies t
1c440 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61  o the page pData
1c450 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e   refers to on en
1c460 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72  try to.** this r
1c470 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
1c480 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1c490 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20  page refered to 
1c4a0 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20  by pData remain 
1c4b0 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
1c4c0 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
1c4d0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
1c4e0 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65   page pData (i.e
1c4f0 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
1c500 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
1c510 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
1c520 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
1c530 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
1c540 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
1c550 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
1c560 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
1c570 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
1c580 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c590 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
1c5a0 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
1c5b0 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
1c5c0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1c5d0 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
1c5e0 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
1c5f0 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
1c600 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
1c610 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
1c620 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
1c630 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
1c640 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
1c650 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
1c660 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65  qlite3pager_move
1c670 70 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  page(Pager *pPag
1c680 65 72 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  er, void *pData,
1c690 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
1c6a0 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
1c6b0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
1c6c0 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c  ;.  PgHdr *pPgOl
1c6d0 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50  d; .  int h;.  P
1c6e0 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  gno needSyncPgno
1c6f0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
1c700 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
1c710 0a 20 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20  .  TRACE5("MOVE 
1c720 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
1c730 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
1c740 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
1c750 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1c760 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1c770 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
1c780 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  ;..  if( pPg->ne
1c790 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65  edSync ){.    ne
1c7a0 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67  edSyncPgno = pPg
1c7b0 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  ->pgno;.    asse
1c7c0 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
1c7d0 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  al );.    assert
1c7e0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a  ( pPg->dirty );.
1c7f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c800 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1c810 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b    }..  /* Unlink
1c820 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68   pPg from it's h
1c830 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
1c840 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
1c850 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
1c860 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
1c870 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
1c880 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
1c890 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
1c8a0 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20  .  ** from it's 
1c8b0 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
1c8c0 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
1c8d0 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
1c8e0 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
1c8f0 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
1c900 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
1c910 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
1c920 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
1c930 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
1c940 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
1c950 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
1c960 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
1c970 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
1c980 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
1c990 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
1c9a0 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
1c9b0 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1c9c0 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67  pPgOld);.    pPg
1c9d0 4f 6c 64 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  Old->dirty = 0;.
1c9e0 20 20 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e      if( pPgOld->
1c9f0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1ca00 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1ca10 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1ca20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1ca30 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70  nal = 1;.      p
1ca40 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  Pg->needSync = 1
1ca50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ca60 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1ca70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
1ca80 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70   /* Change the p
1ca90 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
1caa0 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  Pg and insert it
1cab0 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61   into the new ha
1cac0 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70  sh-chain. */.  p
1cad0 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b  Pg->pgno = pgno;
1cae0 0a 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73  .  h = pager_has
1caf0 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  h(pgno);.  if( p
1cb00 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1cb10 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1cb20 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
1cb30 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
1cb40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
1cb50 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
1cb60 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
1cb70 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
1cb80 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
1cb90 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  .  pPager->aHash
1cba0 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67  [h] = pPg;.  pPg
1cbb0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
1cbc0 0a 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  ..  pPg->dirty =
1cbd0 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69   1;.  pPager->di
1cbe0 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20  rtyCache = 1;.. 
1cbf0 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e   if( needSyncPgn
1cc00 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e  o ){.    /* If n
1cc10 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e  eedSyncPgno is n
1cc20 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  on-zero, then th
1cc30 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  e journal file n
1cc40 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20  eeds to be .    
1cc50 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f  ** sync()ed befo
1cc60 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20 77  re any data is w
1cc70 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61  ritten to databa
1cc80 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65  se file page nee
1cc90 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a  dSyncPgno..    *
1cca0 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20  * Currently, no 
1ccb0 73 75 63 68 20 70 61 67 65 20 65 78 69 73 74 73  such page exists
1ccc0 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63   in the page-cac
1ccd0 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20  he and the .    
1cce0 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72  ** Pager.aInJour
1ccf0 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e  nal bit has been
1cd00 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73   set. This needs
1cd10 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20   to be remedied 
1cd20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a  by loading.    *
1cd30 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  * the page into 
1cd40 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
1cd50 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  and setting the 
1cd60 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66  PgHdr.needSync f
1cd70 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  lag..    **.    
1cd80 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 70 61  ** The sqlite3pa
1cd90 67 65 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d  ger_get() call m
1cda0 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
1cdb0 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
1cdc0 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
1cdd0 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
1cde0 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
1cdf0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
1ce00 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69   int rc;.    voi
1ce10 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20  d *pNeedSync;.  
1ce20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1ce30 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
1ce40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1ce50 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20  ger_get(pPager, 
1ce60 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
1ce70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69  NeedSync);.    i
1ce80 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ce90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1cea0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
1ceb0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  nc = 1;.    DATA
1cec0 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1ced0 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ync)->needSync =
1cee0 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1cef0 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1cf00 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1cf10 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1cf20 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64  DR(pNeedSync)->d
1cf30 69 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 73 71  irty = 1;.    sq
1cf40 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1cf50 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d  (pNeedSync);.  }
1cf60 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1cf70 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
1cf80 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
1cf90 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
1cfa0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
1cfb0 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
1cfc0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
1cfd0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63   of the file loc
1cfe0 6b 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  k for the given 
1cff0 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65  pager..** The re
1d000 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e  turn value is on
1d010 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48  e of NO_LOCK, SH
1d020 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
1d030 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e  VED_LOCK,.** PEN
1d040 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58  DING_LOCK, or EX
1d050 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f  CLUSIVE_LOCK..*/
1d060 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1d070 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65  r_lockstate(Page
1d080 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
1d090 65 66 20 4f 53 5f 54 45 53 54 0a 20 20 72 65 74  ef OS_TEST.  ret
1d0a0 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e  urn pPager->fd->
1d0b0 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c  fd.locktype;.#el
1d0c0 73 65 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  se.  return pPag
1d0d0 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b  er->fd.locktype;
1d0e0 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66  .#endif.}.#endif
1d0f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1d100 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
1d110 74 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61  t a listing of a
1d120 6c 6c 20 72 65 66 65 72 65 6e 63 65 64 20 70 61  ll referenced pa
1d130 67 65 73 20 61 6e 64 20 74 68 65 69 72 20 72 65  ges and their re
1d140 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64  f count..*/.void
1d150 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
1d160 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61  fdump(Pager *pPa
1d170 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
1d180 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  Pg;.  for(pPg=pP
1d190 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
1d1a0 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
1d1b0 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  ll){.    if( pPg
1d1c0 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74  ->nRef<=0 ) cont
1d1d0 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65  inue;.    sqlite
1d1e0 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 50 41  3DebugPrintf("PA
1d1f0 47 45 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e  GE %3d addr=%p n
1d200 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  Ref=%d\n", .    
1d210 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47     pPg->pgno, PG
1d220 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1d230 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20  , pPg->nRef);.  
1d240 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64  }.}.#endif..#end
1d250 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1d260 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a              T_DISKIO */.