/ Hex Artifact Content
Login

Artifact d16a1499385e630396321e48fdebb8eb9f54f362:


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 30  : pager.c,v 1.20
0350: 33 20 32 30 30 35 2f 30 35 2f 32 30 20 32 30 3a  3 2005/05/20 20:
0360: 30 31 3a 35 36 20 64 72 68 20 45 78 70 20 24 0a  01:56 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 63 68 61 72 20 2a 7a 46 69 6c 65 6e  {.  char *zFilen
2520: 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ame;            
2530: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
2540: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2550: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
2560: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2570: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75   Name of the jou
2580: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63  rnal file */.  c
2590: 68 61 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b  har *zDirectory;
25a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69             /* Di
25b0: 72 65 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74  rectory hold dat
25c0: 61 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61  abase and journa
25d0: 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20 4f 73 46  l files */.  OsF
25e0: 69 6c 65 20 66 64 2c 20 6a 66 64 3b 20 20 20 20  ile fd, jfd;    
25f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
2600: 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72   descriptors for
2610: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2620: 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73 46 69 6c  urnal */.  OsFil
2630: 65 20 73 74 66 64 3b 20 20 20 20 20 20 20 20 20  e stfd;         
2640: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2650: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74 68  escriptor for th
2660: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2670: 6f 75 72 6e 61 6c 2a 2f 0a 20 20 69 6e 74 20 64  ournal*/.  int d
2680: 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  bSize;          
2690: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26a0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
26b0: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f   file */.  int o
26c0: 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20  rigDbSize;      
26d0: 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65         /* dbSize
26e0: 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72   before the curr
26f0: 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20  ent change */.  
2700: 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20  int stmtSize;   
2710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2720: 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20  ize of database 
2730: 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74  (in pages) at st
2740: 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20  mt_begin() */.  
2750: 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20  i64 stmtJSize;  
2760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2770: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61  ize of journal a
2780: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
2790: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
27c0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
27d0: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
27e0: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
27f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
2800: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
2810: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
2820: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
2830: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
2840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2850: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
2860: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
2870: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
2880: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
2890: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
28a0: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
28b0: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
28c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
28d0: 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64 2a 2c  structor)(void*,
28e0: 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  int); /* Call th
28f0: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
2900: 66 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f  freeing pages */
2910: 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  .  void (*xReini
2920: 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b  ter)(void*,int);
2930: 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20     /* Call this 
2940: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
2950: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
2960: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20    int pageSize; 
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2980: 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2990: 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   in a page */.  
29a0: 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20  int nPage;      
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29c0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69  otal number of i
29d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a  n-memory pages *
29e0: 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67 65  /.  int nMaxPage
29f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a00: 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d 61  /* High water ma
2a10: 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a 20  rk of nPage */. 
2a20: 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a40: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  Number of in-mem
2a50: 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20 50  ory pages with P
2a60: 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20  gHdr.nRef>0 */. 
2a70: 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20   int mxPage;    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a90: 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
2aa0: 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20  f pages to hold 
2ab0: 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e  in cache */.  in
2ac0: 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73 2c 20 6e  t nHit, nMiss, n
2ad0: 4f 76 66 6c 3b 20 20 20 20 20 2f 2a 20 43 61 63  Ovfl;     /* Cac
2ae0: 68 65 20 68 69 74 73 2c 20 6d 69 73 73 69 6e 67  he hits, missing
2af0: 2c 20 61 6e 64 20 4c 52 55 20 6f 76 65 72 66 6c  , and LRU overfl
2b00: 6f 77 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ows */.  int nRe
2b10: 61 64 2c 6e 57 72 69 74 65 3b 20 20 20 20 20 20  ad,nWrite;      
2b20: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2b30: 20 70 61 67 65 73 20 72 65 61 64 2f 77 72 69 74   pages read/writ
2b40: 74 65 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ten */.  void (*
2b50: 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
2b60: 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f  id*,Pgno,int); /
2b70: 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e  * Routine for en
2b80: 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a  /decoding data *
2b90: 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  /.  void *pCodec
2ba0: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
2bb0: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
2bc0: 74 20 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f  t to xCodec() */
2bd0: 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65  .  u8 journalOpe
2be0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
2bf0: 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61  * True if journa
2c00: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
2c10: 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20  rs is valid */. 
2c20: 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74   u8 journalStart
2c30: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
2c40: 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f  True if header o
2c50: 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  f journal is syn
2c60: 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a  ced */.  u8 useJ
2c70: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20  ournal;         
2c80: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f       /* Use a ro
2c90: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f  llback journal o
2ca0: 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  n this file */. 
2cb0: 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20   u8 noReadlock; 
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2cd0: 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f  Do not bother to
2ce0: 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b   obtain readlock
2cf0: 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70  s */.  u8 stmtOp
2d00: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2d10: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68     /* True if th
2d20: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
2d30: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a  ournal is open *
2d40: 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65  /.  u8 stmtInUse
2d50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d60: 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69  /* True we are i
2d70: 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75  n a statement su
2d80: 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a  btransaction */.
2d90: 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65    u8 stmtAutoope
2da0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  n;            /*
2db0: 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e   Open stmt journ
2dc0: 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75  al when main jou
2dd0: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f  rnal is opened*/
2de0: 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20  .  u8 noSync;   
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e00: 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68  * Do not sync th
2e10: 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75  e journal if tru
2e20: 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79  e */.  u8 fullSy
2e30: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2e40: 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73     /* Do extra s
2e50: 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  yncs of the jour
2e60: 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65  nal for robustne
2e70: 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65  ss */.  u8 state
2e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e90: 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c      /* PAGER_UNL
2ea0: 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52  OCK, _SHARED, _R
2eb0: 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f  ESERVED, etc. */
2ec0: 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20 20  .  u8 errMask;  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ee0: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
2ef0: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
2f00: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
2f10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2f20: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
2f30: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
2f40: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
2f50: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
2f60: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
2f70: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
2f80: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
2f90: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2fa0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2fb0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
2fc0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
2fd0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
2fe0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
2ff0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3000: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3010: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3020: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3030: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3040: 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c 6c  isable dont_roll
3050: 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70  back() for all p
3060: 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d  ages */.  u8 mem
3070: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
3080: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
3090: 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c   inhibit all fil
30a0: 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 2a 61  e I/O */.  u8 *a
30b0: 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  InJournal;      
30c0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69         /* One bi
30d0: 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  t for each page 
30e0: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
30f0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a 61 49  file */.  u8 *aI
3100: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
3110: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74        /* One bit
3120: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
3130: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a  n the database *
3140: 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72  /.  u8 setMaster
3150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3160: 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a  /* True if a m-j
3170: 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77   name has been w
3180: 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a  ritten to jrnl *
3190: 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20  /.  BusyHandler 
31a0: 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20 20  *pBusyHandler;  
31b0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
31c0: 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65 72  lite.busyHandler
31d0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
31e0: 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20 20 20  rst, *pLast;    
31f0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 72 65    /* List of fre
3200: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
3210: 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63 65 64  dr *pFirstSynced
3220: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
3230: 74 20 66 72 65 65 20 70 61 67 65 20 77 69 74 68  t free page with
3240: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
3250: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
3260: 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  All;            
3270: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
3280: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67  ll pages */.  Pg
3290: 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  Hdr *pStmt;     
32a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
32b0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
32c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a  e statement subj
32d0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
32e0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20  journalOff;     
32f0: 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
3300: 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 69  nt byte offset i
3310: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
3320: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
3330: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
3340: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
3350: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
3360: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
3370: 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f 66  .  i64 stmtHdrOf
3380: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  f;             /
3390: 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  * First journal 
33a0: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 74  header written t
33b0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  his statement */
33c0: 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75 6d  .  i64 stmtCksum
33d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
33e0: 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e  * cksumInit when
33f0: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
3400: 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  tarted */.  int 
3410: 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20  sectorSize;     
3420: 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d          /* Assum
3430: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64  ed sector size d
3440: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a  uring rollback *
3450: 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61 73 68  /.  PgHdr *aHash
3460: 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20 20 20  [N_PG_HASH];    
3470: 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74 6f  /* Hash table to
3480: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
3490: 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d 3b 0a   to PgHdr */.};.
34a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65  ./*.** These are
34b0: 20 62 69 74 73 20 74 68 61 74 20 63 61 6e 20 62   bits that can b
34c0: 65 20 73 65 74 20 69 6e 20 50 61 67 65 72 2e 65  e set in Pager.e
34d0: 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65 66 69  rrMask..*/.#defi
34e0: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  ne PAGER_ERR_FUL
34f0: 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a 20 61  L     0x01  /* a
3500: 20 77 72 69 74 65 28 29 20 66 61 69 6c 65 64 20   write() failed 
3510: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3520: 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20 30 78  _ERR_MEM      0x
3530: 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20  02  /* malloc() 
3540: 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e  failed */.#defin
3550: 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  e PAGER_ERR_LOCK
3560: 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20 65 72       0x04  /* er
3570: 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  ror in the locki
3580: 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f 0a 23  ng protocol */.#
3590: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
35a0: 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38 20 20  _CORRUPT  0x08  
35b0: 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72 20 6a  /* database or j
35c0: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
35d0: 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  n */.#define PAG
35e0: 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20 20 20  ER_ERR_DISK     
35f0: 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72 61 6c  0x10  /* general
3600: 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
3610: 2d 20 62 61 64 20 68 61 72 64 20 64 72 69 76 65  - bad hard drive
3620: 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72  ? */../*.** Jour
3630: 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e 20  nal files begin 
3640: 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69  with the followi
3650: 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67 2e  ng magic string.
3660: 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77 61    The data.** wa
3670: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
3680: 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49 74  /dev/random.  It
3690: 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61 73   is used only as
36a0: 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 2e   a sanity check.
36b0: 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65 72  .**.** Since ver
36c0: 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65 20  sion 2.8.0, the 
36d0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
36e0: 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f 6e  ontains addition
36f0: 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68 65  al sanity.** che
3700: 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  cking informatio
3710: 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65 72  n.  If the power
3720: 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68 65   fails while the
3730: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67 69   journal is begi
3740: 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73 65  n.** written, se
3750: 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61 67  mi-random garbag
3760: 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70 70  e data might app
3770: 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ear in the journ
3780: 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65 72  al.** file after
3790: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
37a0: 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65 6d  ed.  If an attem
37b0: 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65 0a  pt is then made.
37c0: 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20 6a  ** to roll the j
37d0: 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68 65  ournal back, the
37e0: 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64 20   database could 
37f0: 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20 54  be corrupted.  T
3800: 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a  he additional.**
3810: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
3820: 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74 65   data is an atte
3830: 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72 20  mpt to discover 
3840: 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20 74  the garbage in t
3850: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  he.** journal an
3860: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a  d ignore it..**.
3870: 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63 68  ** The sanity ch
3880: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
3890: 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20 6a  on for the new j
38a0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f  ournal format co
38b0: 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20 33  nsists.** of a 3
38c0: 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20 6f  2-bit checksum o
38d0: 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20 64  n each page of d
38e0: 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b 73  ata.  The checks
38f0: 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a 2a  um covers both.*
3900: 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * the page numbe
3910: 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65 72  r and the pPager
3920: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
3930: 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68 65   of data for the
3940: 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63   page..** This c
3950: 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  ksum is initiali
3960: 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74 20  zed to a 32-bit 
3970: 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68 61  random value tha
3980: 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68 65  t appears in the
3990: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
39a0: 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68 65   right after the
39b0: 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72 61   header.  The ra
39c0: 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65 72  ndom initializer
39d0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a   is important,.*
39e0: 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61 67  * because garbag
39f0: 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70 65  e data that appe
3a00: 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ars at the end o
3a10: 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  f a journal is l
3a20: 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 68  ikely.** data th
3a30: 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20 6f  at was once in o
3a40: 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74 20  ther files that 
3a50: 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64 65  have now been de
3a60: 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a 2a  leted.  If the.*
3a70: 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20 63  * garbage data c
3a80: 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73 6f  ame from an obso
3a90: 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
3aa0: 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  e, the checksums
3ab0: 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f 72   might.** be cor
3ac0: 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69 6e  rect.  But by in
3ad0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 63  itializing the c
3ae0: 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64 6f  hecksum to rando
3af0: 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a 2a  m value which.**
3b00: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 6f   is different fo
3b10: 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c 2c  r every journal,
3b20: 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68 61   we minimize tha
3b30: 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  t risk..*/.stati
3b40: 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
3b50: 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d 61   char aJournalMa
3b60: 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64 39  gic[] = {.  0xd9
3b70: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
3b80: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
3b90: 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a  0x63, 0xd7,.};..
3ba0: 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20 6f  /*.** The size o
3bb0: 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e 64  f the header and
3bc0: 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69 6e   of each page in
3bd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3be0: 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62 79  determined.** by
3bf0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3c00: 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  acros..*/.#defin
3c10: 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  e JOURNAL_PG_SZ(
3c20: 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67 65  pPager)  ((pPage
3c30: 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20 38  r->pageSize) + 8
3c40: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  )../*.** The jou
3c50: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a 65  rnal header size
3c60: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
3c70: 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   In the future, 
3c80: 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a  this could be.**
3c90: 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61 6c   set to some val
3ca0: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
3cb0: 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72   disk controller
3cc0: 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74 0a  . The important.
3cd0: 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ** characteristi
3ce0: 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73 20  c is that it is 
3cf0: 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73  the same size as
3d00: 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 0a   a disk sector..
3d10: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
3d20: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
3d30: 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  ) (pPager->secto
3d40: 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rSize)../*.** Th
3d50: 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73  e macro MEMDB is
3d60: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
3d70: 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20  dealing with an 
3d80: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3d90: 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69  se..** We do thi
3da0: 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20  s as a macro so 
3db0: 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49  that if the SQLI
3dc0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
3dd0: 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a   macro is set,.*
3de0: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d  * the value of M
3df0: 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63  EMDB will be a c
3e00: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20  onstant and the 
3e10: 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70  compiler will op
3e20: 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f  timize.** out co
3e30: 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65  de that would ne
3e40: 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a  ver execute..*/.
3e50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
3e60: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65  IT_MEMORYDB.# de
3e70: 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c  fine MEMDB 0.#el
3e80: 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44  se.# define MEMD
3e90: 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a  B pPager->memDb.
3ea0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
3eb0: 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65 20 6f  e default size o
3ec0: 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 0a  f a disk sector.
3ed0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3ee0: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35 31 32  _SECTOR_SIZE 512
3ef0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
3f00: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
3f10: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
3f20: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
3f30: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
3f40: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
3f50: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
3f60: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
3f70: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
3f80: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
3f90: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
3fa0: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
3fb0: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
3fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
3fd0: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
3fe0: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
3ff0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
4000: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
4010: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
4020: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
4030: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
4040: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
4050: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
4060: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
4070: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
4080: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
4090: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
40a0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
40b0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
40c0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
40d0: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
40e0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
40f0: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
4100: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
4110: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
4120: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
4130: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
4140: 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e 63   Enable referenc
4150: 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e 67  e count tracking
4160: 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67 29   (for debugging)
4170: 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65 66   here:.*/.#ifdef
4180: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
4190: 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69 6e  int pager3_refin
41a0: 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a 20  fo_enable = 0;. 
41b0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
41c0: 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64 72  er_refinfo(PgHdr
41d0: 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69 63   *p){.    static
41e0: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
41f0: 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72 65    if( !pager3_re
4200: 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20 72  finfo_enable ) r
4210: 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69 74  eturn;.    sqlit
4220: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a 20  e3DebugPrintf(. 
4230: 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20 25        "REFCNT: %
4240: 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d  4d addr=%p nRef=
4250: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 2d  %d\n",.       p-
4260: 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f  >pgno, PGHDR_TO_
4270: 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52 65 66  DATA(p), p->nRef
4280: 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b  .    );.    cnt+
4290: 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e  +;   /* Somethin
42a0: 67 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  g to set a break
42b0: 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a  point on */.  }.
42c0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
42d0: 28 58 29 20 20 70 61 67 65 72 5f 72 65 66 69 6e  (X)  pager_refin
42e0: 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65  fo(X).#else.# de
42f0: 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29 0a  fine REFINFO(X).
4300: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
4310: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
4320: 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76  ger from the giv
4330: 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
4340: 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69  or.  Store the i
4350: 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69  nteger.** that i
4360: 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e  s read in *pRes.
4370: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
4380: 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
4390: 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a   worked, or an.*
43a0: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
43b0: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
43c0: 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  rong..**.** All 
43d0: 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65  values are store
43e0: 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67  d on disk as big
43f0: 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74  -endian..*/.stat
4400: 69 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74  ic int read32bit
4410: 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33  s(OsFile *fd, u3
4420: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33 32 20  2 *pRes){.  u32 
4430: 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  res;.  int rc;. 
4440: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
4450: 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20 73 69  ead(fd, &res, si
4460: 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 69 66  zeof(res));.  if
4470: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
4480: 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  ){.    unsigned 
4490: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 20 20  char ac[4];.    
44a0: 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65 73 2c  memcpy(ac, &res,
44b0: 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 28   4);.    res = (
44c0: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
44d0: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
44e0: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 20  ]<<8) | ac[3];. 
44f0: 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72 65 73   }.  *pRes = res
4500: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
4510: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20  ../*.** Write a 
4520: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69  32-bit integer i
4530: 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66 69  nto the given fi
4540: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
4550: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4560: 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  .** on success o
4570: 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
4580: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
4590: 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74  s wrong..*/.stat
45a0: 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62 69  ic int write32bi
45b0: 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75  ts(OsFile *fd, u
45c0: 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73 69 67  32 val){.  unsig
45d0: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
45e0: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
45f0: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4600: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4610: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4620: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4630: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4640: 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74 75 72   & 0xff;.  retur
4650: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4660: 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a  (fd, ac, 4);.}..
4670: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
4680: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 27  32-bit integer '
4690: 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20 70 61  val' into the pa
46a0: 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
46b0: 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a 2a 20   page header.** 
46c0: 27 70 27 20 61 74 20 6f 66 66 73 65 74 20 27 6f  'p' at offset 'o
46d0: 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61 74 69  ffset'..*/.stati
46e0: 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32 62 69  c void store32bi
46f0: 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67 48 64  ts(u32 val, PgHd
4700: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4710: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4720: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4730: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4740: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4750: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 61 63  ))[offset];.  ac
4760: 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20  [0] = (val>>24) 
4770: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20  & 0xff;.  ac[1] 
4780: 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20 30 78  = (val>>16) & 0x
4790: 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76  ff;.  ac[2] = (v
47a0: 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b 0a 20  al>>8) & 0xff;. 
47b0: 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30   ac[3] = val & 0
47c0: 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  xff;.}../*.** Re
47d0: 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  ad a 32-bit inte
47e0: 67 65 72 20 61 74 20 6f 66 66 73 65 74 20 27 6f  ger at offset 'o
47f0: 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68 65 20  ffset' from the 
4800: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
4810: 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61 64 65  by.** page heade
4820: 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74 69 63  r 'p'..*/.static
4830: 20 75 33 32 20 72 65 74 72 69 65 76 65 33 32 62   u32 retrieve32b
4840: 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20 69 6e  its(PgHdr *p, in
4850: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
4860: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
4870: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
4880: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
4890: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
48a0: 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28 61 63  t];.  return (ac
48b0: 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63 5b 31  [0]<<24) | (ac[1
48c0: 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32 5d 3c  ]<<16) | (ac[2]<
48d0: 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d 0a 0a  <8) | ac[3];.}..
48e0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 74  ./*.** Convert t
48f0: 68 65 20 62 69 74 73 20 69 6e 20 74 68 65 20 70  he bits in the p
4900: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 69  Pager->errMask i
4910: 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72 61 74  nto an approprat
4920: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f 64 65  e.** return code
4930: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4940: 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 50 61  pager_errcode(Pa
4950: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
4960: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
4970: 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  OK;.  if( pPager
4980: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4990: 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20 20 20  R_ERR_LOCK )    
49a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52 4f 54  rc = SQLITE_PROT
49b0: 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50 61 67  OCOL;.  if( pPag
49c0: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
49d0: 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29 20 20  GER_ERR_DISK )  
49e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
49f0: 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ERR;.  if( pPage
4a00: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
4a10: 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20 20 20  ER_ERR_FULL )   
4a20: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
4a30: 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  L;.  if( pPager-
4a40: 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52  >errMask & PAGER
4a50: 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20 20 72  _ERR_MEM )     r
4a60: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
4a70: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
4a80: 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45 52 5f  errMask & PAGER_
4a90: 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20 72 63  ERR_CORRUPT ) rc
4aa0: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
4ab0: 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  T;.  return rc;.
4ac0: 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
4ad0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
4ae0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
4af0: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
4b00: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
4b10: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
4b20: 32 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  2 pager_pagehash
4b30: 28 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a  (PgHdr *pPage){.
4b40: 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b 0a    u32 hash = 0;.
4b50: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
4b60: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 20  ned char *pData 
4b70: 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  = (unsigned char
4b80: 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   *)PGHDR_TO_DATA
4b90: 28 70 50 61 67 65 29 3b 0a 20 20 66 6f 72 28 69  (pPage);.  for(i
4ba0: 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 70 50 61  =0; i<pPage->pPa
4bb0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20 69  ger->pageSize; i
4bc0: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
4bd0: 28 68 61 73 68 2b 69 29 5e 70 44 61 74 61 5b 69  (hash+i)^pData[i
4be0: 5d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ];.  }.  return 
4bf0: 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  hash;.}../*.** T
4c00: 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20 6d 61  he CHECK_PAGE ma
4c10: 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67 48 64  cro takes a PgHd
4c20: 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  r* as an argumen
4c30: 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43 48 45  t. If SQLITE_CHE
4c40: 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73 20 64  CK_PAGES.** is d
4c50: 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44 45 42  efined, and NDEB
4c60: 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  UG is not define
4c70: 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29 20 73  d, an assert() s
4c80: 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b 73 0a  tatement checks.
4c90: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
4ca0: 20 69 73 20 65 69 74 68 65 72 20 64 69 72 74 79   is either dirty
4cb0: 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63 68 65   or still matche
4cc0: 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74 65 64  s the calculated
4cd0: 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f 0a 23   page-hash..*/.#
4ce0: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
4cf0: 45 28 78 29 20 63 68 65 63 6b 50 61 67 65 28 78  E(x) checkPage(x
4d00: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  ).static void ch
4d10: 65 63 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70  eckPage(PgHdr *p
4d20: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
4d30: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
4d40: 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  er;.  assert( !p
4d50: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c 7c 20  Pg->pageHash || 
4d60: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4d70: 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50 67 2d  || MEMDB || pPg-
4d80: 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20 20 20  >dirty || .     
4d90: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d   pPg->pageHash==
4da0: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
4db0: 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a  Pg) );.}..#else.
4dc0: 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41  #define CHECK_PA
4dd0: 47 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  GE(x).#endif../*
4de0: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73  .** When this is
4df0: 20 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72   called the jour
4e00: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
4e10: 65 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62  er pPager must b
4e20: 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d  e open..** The m
4e30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
4e40: 6c 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20  le name is read 
4e50: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
4e60: 74 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  the file and .**
4e70: 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65   written into me
4e80: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
4e90: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
4ea0: 29 2e 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a  ). *pzMaster is.
4eb0: 2a 2a 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  ** set to point 
4ec0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e  at the memory an
4ed0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
4ee0: 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72  rned. The caller
4ef0: 20 6d 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46   must.** sqliteF
4f00: 72 65 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e  ree() *pzMaster.
4f10: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73  .**.** If no mas
4f20: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4f30: 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74   name is present
4f40: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65   *pzMaster is se
4f50: 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51  t to 0 and.** SQ
4f60: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
4f70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4f80: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
4f90: 6c 28 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c  l(OsFile *pJrnl,
4fa0: 20 63 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72   char **pzMaster
4fb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
4fc0: 33 32 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a  32 len;.  i64 sz
4fd0: 4a 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a  J;.  u32 cksum;.
4fe0: 20 20 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67    int i;.  unsig
4ff0: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5000: 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20  8]; /* A buffer 
5010: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
5020: 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a  c header */..  *
5030: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20  pzMaster = 0;.. 
5040: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
5050: 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26  ileSize(pJrnl, &
5060: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
5070: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a  SQLITE_OK || szJ
5080: 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b  <16 ) return rc;
5090: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
50a0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
50b0: 4a 2d 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21  J-16);.  if( rc!
50c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
50d0: 75 72 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d  urn rc;. .  rc =
50e0: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
50f0: 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20  l, &len);.  if( 
5100: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
5110: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
5120: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a   = read32bits(pJ
5130: 72 6e 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  rnl, &cksum);.  
5140: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
5150: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
5160: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5170: 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67  Read(pJrnl, aMag
5180: 69 63 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63  ic, 8);.  if( rc
5190: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d  !=SQLITE_OK || m
51a0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
51b0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20  ournalMagic, 8) 
51c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
51d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
51e0: 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ek(pJrnl, szJ-16
51f0: 2d 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  -len);.  if( rc!
5200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5210: 75 72 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61  urn rc;..  *pzMa
5220: 73 74 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73  ster = (char *)s
5230: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b  qliteMalloc(len+
5240: 31 29 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61  1);.  if( !*pzMa
5250: 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75  ster ){.    retu
5260: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
5270: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
5280: 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c  te3OsRead(pJrnl,
5290: 20 2a 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29   *pzMaster, len)
52a0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
52b0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
52c0: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
52d0: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
52e0: 72 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  r = 0;.    retur
52f0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
5300: 53 65 65 20 69 66 20 74 68 65 20 63 68 65 63 6b  See if the check
5310: 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20  sum matches the 
5320: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5330: 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ame */.  for(i=0
5340: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
5350: 20 20 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a     cksum -= (*pz
5360: 4d 61 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a  Master)[i];.  }.
5370: 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20    if( cksum ){. 
5380: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65     /* If the che
5390: 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64  cksum doesn't ad
53a0: 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f  d up, then one o
53b0: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69  r more of the di
53c0: 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a  sk sectors.    *
53d0: 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
53e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
53f0: 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72  filename is corr
5400: 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e  upted. This mean
5410: 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74  s.    ** definit
5420: 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73  ely roll back, s
5430: 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  o just return SQ
5440: 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f  LITE_OK and repo
5450: 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a  rt a (nul).    *
5460: 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
5470: 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a   filename..    *
5480: 2f 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  /.    sqliteFree
5490: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
54a0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
54b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70    }else{.    (*p
54c0: 7a 4d 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20  zMaster)[len] = 
54d0: 27 5c 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20  '\0';.  }.   .  
54e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
54f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  ;.}../*.** Seek 
5500: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5510: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5520: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
5530: 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a  oundary where a.
5540: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
5550: 72 20 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72  r may be read or
5560: 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e   written. Pager.
5570: 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70  journalOff is up
5580: 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  dated with.** th
5590: 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65  e new seek offse
55a0: 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72  t..**.** i.e for
55b0: 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f   a sector size o
55c0: 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70  f 512:.**.** Inp
55d0: 75 74 20 4f 66 66 73 65 74 20 20 20 20 20 20 20  ut Offset       
55e0: 20 20 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66         Output Of
55f0: 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  fset.** --------
5600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
5620: 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20 20 20  ** 0            
5630: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a               0.*
5640: 2a 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20  * 512           
5650: 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a              512.
5660: 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20 20 20  ** 100          
5670: 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31 32               512
5680: 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20 20 20  .** 2000        
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 30                20
56a0: 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63  48.** .*/.static
56b0: 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c   int seekJournal
56c0: 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  Hdr(Pager *pPage
56d0: 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74  r){.  i64 offset
56e0: 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20   = 0;.  i64 c = 
56f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
5700: 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20  ff;.  if( c ){. 
5710: 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d     offset = ((c-
5720: 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  1)/JOURNAL_HDR_S
5730: 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a  Z(pPager) + 1) *
5740: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5750: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61  pPager);.  }.  a
5760: 73 73 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f  ssert( offset%JO
5770: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5780: 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ger)==0 );.  ass
5790: 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29  ert( offset>=c )
57a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f 66 66  ;.  assert( (off
57b0: 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48  set-c)<JOURNAL_H
57c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
57d0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
57e0: 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a  alOff = offset;.
57f0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5800: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
5810: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
5820: 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a  rnalOff);.}../*.
5830: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
5840: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
5850: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
5860: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
5870: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
5880: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
5890: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
58a0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
58b0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
58c0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
58d0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
58e0: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
58f0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
5900: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
5910: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
5920: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
5930: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
5940: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
5950: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
5960: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
5970: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
5980: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
5990: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
59a0: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
59b0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
59c0: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
59d0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
59e0: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
59f0: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
5a00: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
5a10: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
5a20: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
5a30: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
5a40: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
5a50: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
5a60: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
5a70: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
5a80: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
5a90: 29 7b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  ){..  int rc = s
5aa0: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
5ab0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
5ac0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
5ad0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
5ae0: 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  dr = pPager->jou
5af0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70  rnalOff;.  if( p
5b00: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
5b10: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  f==0 ){.    pPag
5b20: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d  er->stmtHdrOff =
5b30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5b40: 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Hdr;.  }.  pPage
5b50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
5b60: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
5b70: 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46  pPager);..  /* F
5b80: 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a  IX ME: .  **.  *
5b90: 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61  * Possibly for a
5ba0: 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f   pager not in no
5bb0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20  -sync mode, the 
5bc0: 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68  journal magic sh
5bd0: 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65  ould not.  ** be
5be0: 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e   written until n
5bf0: 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e  Rec is filled in
5c00: 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74   as part of next
5c10: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20   syncJournal(). 
5c20: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61  .  **.  ** Actua
5c30: 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20 77 68  lly maybe the wh
5c40: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ole journal head
5c50: 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c  er should be del
5c60: 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a  ayed until that.
5c70: 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e    ** point. Thin
5c80: 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20  k about this..  
5c90: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
5ca0: 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
5cb0: 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d  ->jfd, aJournalM
5cc0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f  agic, sizeof(aJo
5cd0: 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20  urnalMagic));.. 
5ce0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5cf0: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
5d00: 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46   nRec Field. 0xF
5d10: 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73  FFFFFFF for no-s
5d20: 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f  ync journals. */
5d30: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5d40: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5d50: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  fd, pPager->noSy
5d60: 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  nc ? 0xffffffff 
5d70: 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  : 0);.  }.  if( 
5d80: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5d90: 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64  .    /* The rand
5da0: 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e  om check-hash in
5db0: 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20  itialiser */ .  
5dc0: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
5dd0: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
5de0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
5df0: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
5e00: 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69  t);.    rc = wri
5e10: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
5e20: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63  ->jfd, pPager->c
5e30: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20  ksumInit);.  }. 
5e40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5e50: 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  OK ){.    /* The
5e60: 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   initial databas
5e70: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63  e size */.    rc
5e80: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
5e90: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
5ea0: 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20  ger->dbSize);.  
5eb0: 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
5ec0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20  TE_OK ){.    /* 
5ed0: 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74  The assumed sect
5ee0: 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73  or size for this
5ef0: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20   process */.    
5f00: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
5f10: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5f20: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
5f30: 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  e);.  }..  /* Th
5f40: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
5f50: 20 68 61 73 20 62 65 65 6e 20 77 72 69 74 74 65   has been writte
5f60: 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20  n successfully. 
5f70: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
5f80: 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  .  ** file descr
5f90: 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64  iptor to the end
5fa0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
5fb0: 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20  header sector.. 
5fc0: 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
5fd0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
5fe0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
5ff0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
6000: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29  r->journalOff-1)
6010: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
6020: 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
6030: 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20  r->jfd, "\000", 
6040: 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  1);.  }.  return
6050: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
6060: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
6070: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
6080: 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e   this is called.
6090: 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   A journal heade
60a0: 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e  r file.** (JOURN
60b0: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29  AL_HDR_SZ bytes)
60c0: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
60d0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
60e0: 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  on in the journa
60f0: 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63  l.** file. See c
6100: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
6110: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
6120: 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64  nalHdr() for a d
6130: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a  escription of.**
6140: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6150: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
6160: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
6170: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
6180: 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73  ully, *nRec is s
6190: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
61a0: 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f   of.** page reco
61b0: 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  rds following th
61c0: 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64  is header and *d
61d0: 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  bSize is set to 
61e0: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a  the size of the.
61f0: 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  ** database befo
6200: 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
6210: 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67  on began, in pag
6220: 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72  es. Also, pPager
6230: 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69  ->cksumInit.** i
6240: 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
6250: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
6260: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
6270: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
6280: 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69  turned.** in thi
6290: 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  s case..**.** If
62a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
62b0: 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72 73  der file appears
62c0: 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64   to be corrupted
62d0: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
62e0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64  .** returned and
62f0: 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69   *nRec and *dbSi
6300: 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20  ze are not set. 
6310: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
6320: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
6330: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
6340: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6350: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
6360: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
6370: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
6380: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
6390: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36  r *pPager, .  i6
63a0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20  4 journalSize,. 
63b0: 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20   u32 *pNRec, .  
63c0: 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a  u32 *pDbSize.){.
63d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69    int rc;.  unsi
63e0: 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63  gned char aMagic
63f0: 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72  [8]; /* A buffer
6400: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67   to hold the mag
6410: 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20  ic header */..  
6420: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
6430: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
6440: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
6450: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
6460: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55  ->journalOff+JOU
6470: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6480: 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a  er) > journalSiz
6490: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
64a0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
64b0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
64c0: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
64d0: 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a  jfd, aMagic, siz
64e0: 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20  eof(aMagic));.  
64f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6500: 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d  rc;..  if( memcm
6510: 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e  p(aMagic, aJourn
6520: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
6530: 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20  aMagic))!=0 ){. 
6540: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6550: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
6560: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70   = read32bits(&p
6570: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65  Pager->jfd, pNRe
6580: 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  c);.  if( rc ) r
6590: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
65a0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50  = read32bits(&pP
65b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67  ager->jfd, &pPag
65c0: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
65d0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
65e0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65  n rc;..  rc = re
65f0: 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72  ad32bits(&pPager
6600: 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b  ->jfd, pDbSize);
6610: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6620: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64  rn rc;..  /* Upd
6630: 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64 20  ate the assumed 
6640: 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d  sector-size to m
6650: 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20 75  atch the value u
6660: 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65  sed by .  ** the
6670: 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 72   process that cr
6680: 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e  eated this journ
6690: 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72  al. If this jour
66a0: 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65  nal was.  ** cre
66b0: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
66c0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69  s other than thi
66d0: 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73  s one, then this
66e0: 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73   routine.  ** is
66f0: 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72   being called fr
6700: 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f  om within pager_
6710: 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20  playback(). The 
6720: 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a  local value.  **
6730: 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72   of Pager.sector
6740: 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64  Size is restored
6750: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
6760: 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a  hat routine..  *
6770: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  /.  rc = read32b
6780: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
6790: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
67a0: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
67b0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
67c0: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
67d0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
67e0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
67f0: 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
6800: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
6810: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
6820: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
6830: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
6840: 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73  *.** Write the s
6850: 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a  upplied master j
6860: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f  ournal name into
6870: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6880: 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70  e for pager.** p
6890: 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72  Pager at the cur
68a0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  rent location. T
68b0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
68c0: 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74  l name must be t
68d0: 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67  he last.** thing
68e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f   written to a jo
68f0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
6900: 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66  he pager is in f
6910: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74  ull-sync mode, t
6920: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
6930: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
6940: 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65   advanced to the
6950: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
6960: 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ndary before.** 
6970: 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74  anything is writ
6980: 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20  ten. The format 
6990: 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79  is:.**.** + 4 by
69a0: 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47  tes: PAGER_MJ_PG
69b0: 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73  NO..** + N bytes
69c0: 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74  : length of mast
69d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
69e0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e  .** + 4 bytes: N
69f0: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d  .** + 4 bytes: M
6a00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6a10: 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  me checksum..** 
6a20: 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72  + 8 bytes: aJour
6a30: 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a  nalMagic[]..**.*
6a40: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
6a50: 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73  rnal page checks
6a60: 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66  um is the sum of
6a70: 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68   the bytes in th
6a80: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  e master.** jour
6a90: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  nal name..*/.sta
6aa0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73  tic int writeMas
6ab0: 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  terJournal(Pager
6ac0: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
6ad0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
6ae0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
6af0: 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a  len; .  int i; .
6b00: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
6b10: 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65   ..  if( !zMaste
6b20: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
6b30: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
6b40: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
6b50: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
6b60: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
6b70: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
6b80: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
6b90: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
6ba0: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
6bb0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
6bc0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
6bd0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
6be0: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
6bf0: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
6c00: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
6c10: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
6c20: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
6c30: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
6c40: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
6c50: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
6c60: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
6c70: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
6c80: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
6c90: 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f  .    rc = seekJo
6ca0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
6cb0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
6cc0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6cd0: 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65   rc;.  }.  pPage
6ce0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
6cf0: 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63   (len+20);..  rc
6d00: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
6d10: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47  pPager->jfd, PAG
6d20: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
6d30: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
6d40: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
6d50: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
6d60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
6d70: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
6d80: 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  er, len);.  if( 
6d90: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6da0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6db0: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
6dc0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e  pPager->jfd, len
6dd0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6de0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
6df0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  rc;..  rc = writ
6e00: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
6e10: 3e 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20  >jfd, cksum);.  
6e20: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6e30: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
6e40: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6e50: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
6e60: 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  fd, aJournalMagi
6e70: 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  c, sizeof(aJourn
6e80: 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61  alMagic));.  pPa
6e90: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
6ea0: 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
6eb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20  }../*.** Add or 
6ec0: 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72  remove a page fr
6ed0: 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  om the list of a
6ee0: 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20 61 72  ll pages that ar
6ef0: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74  e in the.** stat
6f00: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
6f10: 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b  *.** The Pager k
6f20: 65 65 70 73 20 61 20 73 65 70 61 72 61 74 65 20  eeps a separate 
6f30: 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 74 68  list of pages th
6f40: 61 74 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79  at are currently
6f50: 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65   in.** the state
6f60: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ment journal.  T
6f70: 68 69 73 20 68 65 6c 70 73 20 74 68 65 20 73 71  his helps the sq
6f80: 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
6f90: 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74  commit().** rout
6fa0: 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73  ine run MUCH fas
6fb0: 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d  ter for the comm
6fc0: 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74 68  on case where th
6fd0: 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20  ere are many.** 
6fe0: 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20  pages in memory 
6ff0: 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61  but only a few a
7000: 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  re in the statem
7010: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ent journal..*/.
7020: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
7030: 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
7040: 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  t(PgHdr *pPg){. 
7050: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
7060: 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
7070: 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  if( pPg->inStmt 
7080: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
7090: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
70a0: 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e  mt==0 && pPg->pN
70b0: 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  extStmt==0 );.  
70c0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
70d0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
70e0: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70  ->pStmt ){.    p
70f0: 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50  Pager->pStmt->pP
7100: 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20  revStmt = pPg;. 
7110: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53   }.  pPg->pNextS
7120: 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53  tmt = pPager->pS
7130: 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tmt;.  pPager->p
7140: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50  Stmt = pPg;.  pP
7150: 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d  g->inStmt = 1;.}
7160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7170: 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
7180: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
7190: 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d  Pg){.  if( !pPg-
71a0: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
71b0: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72  ;.  if( pPg->pPr
71c0: 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73  evStmt ){.    as
71d0: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
71e0: 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d  Stmt->pNextStmt=
71f0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7200: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
7210: 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  tStmt = pPg->pNe
7220: 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  xtStmt;.  }else{
7230: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
7240: 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d  ->pPager->pStmt=
7250: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
7260: 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d  >pPager->pStmt =
7270: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
7280: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
7290: 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20  pNextStmt ){.   
72a0: 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
72b0: 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74  extStmt->pPrevSt
72c0: 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  mt==pPg );.    p
72d0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
72e0: 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
72f0: 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20  pPrevStmt;.  }. 
7300: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
7310: 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  = 0;.  pPg->pPre
7320: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  vStmt = 0;.  pPg
7330: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a  ->inStmt = 0;.}.
7340: 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61  ./*.** Find a pa
7350: 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74  ge in the hash t
7360: 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70  able given its p
7370: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74  age number.  Ret
7380: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
7390: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
73a0: 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
73b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48  d..*/.static PgH
73c0: 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  dr *pager_lookup
73d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
73e0: 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
73f0: 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d  Hdr *p = pPager-
7400: 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73  >aHash[pager_has
7410: 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c  h(pgno)];.  whil
7420: 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21  e( p && p->pgno!
7430: 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d  =pgno ){.    p =
7440: 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20   p->pNextHash;. 
7450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d   }.  return p;.}
7460: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
7470: 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
7480: 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d  clear the in-mem
7490: 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68 69 73  ory cache.  This
74a0: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73   routine.** sets
74b0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
74c0: 65 20 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20  e pager back to 
74d0: 77 68 61 74 20 69 74 20 77 61 73 20 77 68 65 6e  what it was when
74e0: 20 69 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a   it was first.**
74f0: 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75   opened.  Any ou
7500: 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20  tstanding pages 
7510: 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20  are invalidated 
7520: 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74 20 61  and subsequent a
7530: 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63  ttempts.** to ac
7540: 63 65 73 73 20 74 68 6f 73 65 20 70 61 67 65 73  cess those pages
7550: 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73   will likely res
7560: 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d  ult in a coredum
7570: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
7580: 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50 61  d pager_reset(Pa
7590: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
75a0: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
75b0: 78 74 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  xt;.  if( pPager
75c0: 2d 3e 65 72 72 4d 61 73 6b 20 29 20 72 65 74 75  ->errMask ) retu
75d0: 72 6e 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  rn;.  for(pPg=pP
75e0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
75f0: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
7600: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
7610: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69  extAll;.    sqli
7620: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d  teFree(pPg);.  }
7630: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
7640: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
7650: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
7660: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  0;.  pPager->pLa
7670: 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  st = 0;.  pPager
7680: 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65  ->pAll = 0;.  me
7690: 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61  mset(pPager->aHa
76a0: 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  sh, 0, sizeof(pP
76b0: 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20  ager->aHash));. 
76c0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
76d0: 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
76e0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
76f0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73  ESERVED ){.    s
7700: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
7710: 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
7720: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  }.  sqlite3OsUnl
7730: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
7740: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61   NO_LOCK);.  pPa
7750: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
7760: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
7770: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
7780: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
7790: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
77a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
77b0: 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  pen==0 );.}../*.
77c0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
77d0: 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 73 65   is used to rese
77e0: 74 20 74 68 65 20 70 61 67 65 72 20 61 66 74 65  t the pager afte
77f0: 72 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  r a malloc() fai
7800: 6c 75 72 65 2e 20 54 68 69 73 0a 2a 2a 20 64 6f  lure. This.** do
7810: 65 73 6e 27 74 20 77 6f 72 6b 20 77 69 74 68 20  esn't work with 
7820: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
7830: 73 65 73 2e 20 49 66 20 61 20 6d 61 6c 6c 6f 63  ses. If a malloc
7840: 28 29 20 66 61 69 6c 73 20 77 68 65 6e 20 61 6e  () fails when an
7850: 20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64   .** in-memory d
7860: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 75 73  atabase is in us
7870: 65 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  e it is not poss
7880: 69 62 6c 65 20 74 6f 20 72 65 63 6f 76 65 72 2e  ible to recover.
7890: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e  .**.** If a tran
78a0: 73 61 63 74 69 6f 6e 20 6f 72 20 73 74 61 74 65  saction or state
78b0: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
78c0: 20 69 73 20 61 63 74 69 76 65 2c 20 69 74 20 69   is active, it i
78d0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
78e0: 2a 0a 2a 2a 20 49 74 20 69 73 20 61 6e 20 65 72  *.** It is an er
78f0: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
7900: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 61 6e 79   function if any
7910: 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75 73   pages are in us
7920: 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  e..*/.#ifndef SQ
7930: 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c  LITE_OMIT_GLOBAL
7940: 52 45 43 4f 56 45 52 0a 69 6e 74 20 73 71 6c 69  RECOVER.int sqli
7950: 74 65 33 70 61 67 65 72 5f 72 65 73 65 74 28 50  te3pager_reset(P
7960: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
7970: 20 69 66 28 20 70 50 61 67 65 72 20 29 7b 0a 20   if( pPager ){. 
7980: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
7990: 52 65 66 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  Ref || MEMDB ){.
79a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
79b0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
79c0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
79d0: 4d 61 73 6b 20 26 3d 20 7e 28 50 41 47 45 52 5f  Mask &= ~(PAGER_
79e0: 45 52 52 5f 4d 45 4d 29 3b 0a 20 20 20 20 70 61  ERR_MEM);.    pa
79f0: 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
7a00: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
7a10: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
7a20: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  dif.../*.** When
7a30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
7a40: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
7a50: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
7a60: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
7a70: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
7a80: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
7a90: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
7aa0: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7ab0: 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20  releases.** the 
7ac0: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
7ad0: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
7ae0: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
7af0: 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72  place.  The jour
7b00: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64  nal.** file is d
7b10: 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  eleted and close
7b20: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
7b30: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
7b40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7b50: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
7b60: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
7b70: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
7b80: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
7b90: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
7ba0: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
7bb0: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
7bc0: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
7bd0: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
7be0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e  tic int pager_un
7bf0: 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20  writelock(Pager 
7c00: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7c10: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
7c20: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
7c30: 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
7c40: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
7c50: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
7c60: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7c70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70  ;.  }.  sqlite3p
7c80: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
7c90: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
7ca0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
7cb0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7cc0: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7cd0: 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  stfd);.    pPage
7ce0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
7cf0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7d00: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
7d10: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
7d20: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
7d30: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
7d40: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
7d50: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
7d60: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
7d70: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
7d80: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
7d90: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
7da0: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
7db0: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
7dc0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7dd0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7de0: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7df0: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
7e00: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
7e10: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
7e20: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
7e30: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
7e40: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
7e50: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
7e60: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
7e70: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
7e80: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
7e90: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
7ea0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
7eb0: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
7ec0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7ed0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
7ee0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
7ef0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
7f00: 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
7f10: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
7f20: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  =0 );.  }.  rc =
7f30: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
7f40: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  (&pPager->fd, SH
7f50: 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50  ARED_LOCK);.  pP
7f60: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
7f70: 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70 50  GER_SHARED;.  pP
7f80: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
7f90: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7fa0: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
7fb0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
7fc0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
7fd0: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
7fe0: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
7ff0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
8000: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
8010: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
8020: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
8030: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
8040: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
8050: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
8060: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
8070: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
8080: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
8090: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
80a0: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
80b0: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
80c0: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
80d0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
80e0: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
80f0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
8100: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
8110: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
8120: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
8130: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
8140: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
8150: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
8160: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
8170: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
8180: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
8190: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
81a0: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
81b0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
81c0: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
81d0: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
81e0: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
81f0: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
8200: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
8210: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
8220: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
8230: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
8240: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
8250: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
8260: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
8270: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
8280: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
8290: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
82a0: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
82b0: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
82c0: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
82d0: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
82e0: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
82f0: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
8300: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
8310: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
8320: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
8330: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
8340: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
8350: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
8360: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
8370: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
8380: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
8390: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
83a0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
83b0: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
83c0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
83d0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
83e0: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
83f0: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
8400: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 44  , const char *aD
8410: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
8420: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
8430: 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d  mInit;.  int i =
8440: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8450: 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28 20  e-200;.  while( 
8460: 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d  i>0 ){.    cksum
8470: 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20   += aData[i];.  
8480: 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a    i -= 200;.  }.
8490: 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a    return cksum;.
84a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20  }../*.** Read a 
84b0: 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d  single page from
84c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
84d0: 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65  e opened on file
84e0: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a   descriptor.** j
84f0: 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74 68  fd.  Playback th
8500: 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a  is one page..**.
8510: 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d  ** If useCksum==
8520: 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73 20  0 it means this 
8530: 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74  journal does not
8540: 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e 20   use checksums. 
8550: 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72   Checksums.** ar
8560: 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73 74  e not used in st
8570: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
8580: 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d 65   because stateme
8590: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e  nt journals do n
85a0: 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75  ot.** need to su
85b0: 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69 6c  rvive power fail
85c0: 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ures..*/.static 
85d0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
85e0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67 65  ck_one_page(Page
85f0: 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69 6c  r *pPager, OsFil
8600: 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65 43  e *jfd, int useC
8610: 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ksum){.  int rc;
8620: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
8630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8640: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
8650: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
8660: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
8670: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8680: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
8690: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
86a0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
86b0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86d0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
86e0: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
86f0: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44 61  king */.  u8 aDa
8700: 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ta[SQLITE_MAX_PA
8710: 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65  GE_SIZE];  /* Te
8720: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
8730: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75   page */..  /* u
8740: 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62  seCksum should b
8750: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
8760: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
8770: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
8780: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8790: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
87a0: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
87b0: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
87c0: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75  ssert( jfd == (u
87d0: 73 65 43 6b 73 75 6d 20 3f 20 26 70 50 61 67 65  seCksum ? &pPage
87e0: 72 2d 3e 6a 66 64 20 3a 20 26 70 50 61 67 65 72  r->jfd : &pPager
87f0: 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a 20 20 72  ->stfd) );...  r
8800: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
8810: 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  fd, &pgno);.  if
8820: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8830: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
8840: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
8850: 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20 70  d(jfd, &aData, p
8860: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8870: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8880: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
8890: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
88a0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
88b0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
88c0: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
88d0: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
88e0: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
88f0: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
8900: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
8910: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
8920: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
8930: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
8940: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
8950: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
8960: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
8970: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
8980: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
8990: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
89a0: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
89b0: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
89c0: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
89d0: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
89e0: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
89f0: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
8a00: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
8a10: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
8a20: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8a30: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
8a40: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
8a50: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
8a60: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
8a70: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
8a80: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
8a90: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
8aa0: 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75 6d  bits(jfd, &cksum
8ab0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
8ac0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
8ad0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8ae0: 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28 20  f += 4;.    if( 
8af0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
8b00: 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61 29  er, pgno, aData)
8b10: 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20  !=cksum ){.     
8b20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8b30: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
8b40: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
8b50: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
8b60: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
8b70: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
8b80: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
8b90: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
8ba0: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
8bb0: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
8bc0: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
8bd0: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
8be0: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
8bf0: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
8c00: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
8c10: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
8c20: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
8c30: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
8c40: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
8c50: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
8c60: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
8c70: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
8c80: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
8c90: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
8ca0: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
8cb0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
8cc0: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
8cd0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
8ce0: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
8cf0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
8d00: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
8d10: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
8d20: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
8d30: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
8d40: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
8d50: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
8d60: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
8d70: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
8d80: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
8d90: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
8da0: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
8db0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
8dc0: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
8dd0: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
8de0: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
8df0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
8e00: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
8e10: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
8e20: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
8e30: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
8e40: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
8e50: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
8e60: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
8e70: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
8e80: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
8e90: 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  are in the main 
8ea0: 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f  rollback.  ** jo
8eb0: 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69 73  urnal.  Otherwis
8ec0: 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f 4c  e, if a full ROL
8ed0: 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66 74  LBACK occurs aft
8ee0: 65 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  er the statement
8ef0: 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 74  .  ** rollback t
8f00: 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b  he full ROLLBACK
8f10: 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f 72   will not restor
8f20: 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 69 74  e the page to it
8f30: 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20  s original.  ** 
8f40: 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63 6f  content.  Two co
8f50: 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65  nditions must be
8f60: 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69 74   met before writ
8f70: 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
8f80: 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e 20  ase.  ** files. 
8f90: 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65  (1) the database
8fa0: 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64 2e   must be locked.
8fb0: 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74 68    (2) we know th
8fc0: 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a  at the original.
8fd0: 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65 6e    ** page conten
8fe0: 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  t is in the main
8ff0: 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72 20   journal either 
9000: 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
9010: 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a 20   is not in.  ** 
9020: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69 74  cache or else it
9030: 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
9040: 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f 0a  edSync==0..  */.
9050: 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
9060: 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
9070: 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  o);.  assert( pP
9080: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
9090: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20  ER_EXCLUSIVE || 
90a0: 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41 43  pPg!=0 );.  TRAC
90b0: 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64 20  E3("PLAYBACK %d 
90c0: 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
90d0: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
90e0: 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  o);.  if( pPager
90f0: 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
9100: 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67  XCLUSIVE && (pPg
9110: 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64  ==0 || pPg->need
9120: 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Sync==0) ){.    
9130: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
9140: 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
9150: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
9160: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9170: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
9180: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
9190: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
91a0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
91b0: 66 28 20 70 50 67 20 29 20 70 50 67 2d 3e 64 69  f( pPg ) pPg->di
91c0: 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  rty = 0;.  }.  i
91d0: 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a  f( pPg ){.    /*
91e0: 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20   No page should 
91f0: 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69 74  ever be explicit
9200: 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74  ly rolled back t
9210: 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65  hat is in use, e
9220: 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
9230: 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69 73   page 1 which is
9240: 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20   held in use in 
9250: 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68  order to keep th
9260: 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e lock on the.  
9270: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63    ** database ac
9280: 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75  tive. However su
9290: 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62 65  ch a page may be
92a0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20   rolled back as 
92b0: 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  a result.    ** 
92c0: 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65  of an internal e
92d0: 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69  rror resulting i
92e0: 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63  n an automatic c
92f0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9300: 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
9310: 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  ack()..    */.  
9320: 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20    void *pData;. 
9330: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50     /* assert( pP
9340: 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50  g->nRef==0 || pP
9350: 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f  g->pgno==1 ); */
9360: 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47 48  .    pData = PGH
9370: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b  DR_TO_DATA(pPg);
9380: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74  .    memcpy(pDat
9390: 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72  a, aData, pPager
93a0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
93b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
93c0: 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a  structor ){  /**
93d0: 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c  * FIX ME:  Shoul
93e0: 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e 69  d this be xReini
93f0: 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50  t? ***/.      pP
9400: 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
9410: 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d  r(pData, pPager-
9420: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9430: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9440: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
9450: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
9460: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
9470: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
9480: 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
9490: 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
94a0: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
94b0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61   rc;.}../*.** Pa
94c0: 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20  rameter zMaster 
94d0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
94e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
94f0: 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a  file. A single j
9500: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74  ournal.** file t
9510: 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f 20  hat referred to 
9520: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9530: 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74  al file has just
9540: 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63   been rolled bac
9550: 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  k..** This routi
9560: 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74 20  ne checks if it 
9570: 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
9580: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
9590: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a   journal file,.*
95a0: 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66  * and does so if
95b0: 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   it is..**.** Th
95c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
95d0: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
95e0: 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
95f0: 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a  child journals..
9600: 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20  ** To tell if a 
9610: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63  master journal c
9620: 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63  an be deleted, c
9630: 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20  heck to each of 
9640: 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e  the.** children.
9650: 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65    If all childre
9660: 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69 73  n are either mis
9670: 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72  sing or do not r
9680: 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66  efer to.** a dif
9690: 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f  ferent master jo
96a0: 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73  urnal, then this
96b0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
96c0: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a  can be deleted..
96d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
96e0: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f  ger_delmaster(co
96f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
9700: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
9710: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
9720: 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61  = 0;.  OsFile ma
9730: 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d  ster;.  char *zM
9740: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
9750: 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
9760: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9770: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
9780: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
9790: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
97a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
97b0: 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e  le */..  /* Open
97c0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
97d0: 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69  nal file exclusi
97e0: 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d  vely in case som
97f0: 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
9800: 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20    ** is running 
9810: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  this routine als
9820: 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d  o. Not that it m
9830: 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69  akes too much di
9840: 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20  fference..  */. 
9850: 20 6d 65 6d 73 65 74 28 26 6d 61 73 74 65 72 2c   memset(&master,
9860: 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74 65   0, sizeof(maste
9870: 72 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  r));.  rc = sqli
9880: 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
9890: 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74  y(zMaster, &mast
98a0: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  er);.  if( rc!=S
98b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
98c0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
98d0: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
98e0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
98f0: 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61 73 74  OsFileSize(&mast
9900: 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72  er, &nMasterJour
9910: 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  nal);.  if( rc!=
9920: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
9930: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9940: 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f  .  if( nMasterJo
9950: 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63  urnal>0 ){.    c
9960: 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20  har *zJournal;. 
9970: 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72     char *zMaster
9980: 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  Ptr = 0;..    /*
9990: 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
99a0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
99b0: 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
99c0: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
99d0: 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f    ** sqliteMallo
99e0: 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20  c() and pointed 
99f0: 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75  to by zMasterJou
9a00: 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rnal. .    */.  
9a10: 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c    zMasterJournal
9a20: 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
9a30: 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a  eMalloc(nMasterJ
9a40: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  ournal);.    if(
9a50: 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   !zMasterJournal
9a60: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
9a70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9a80: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
9a90: 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  r_out;.    }.   
9aa0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
9ab0: 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61  ead(&master, zMa
9ac0: 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61  sterJournal, nMa
9ad0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
9ae0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9af0: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
9b00: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
9b10: 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
9b20: 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
9b30: 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
9b40: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
9b50: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
9b60: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
9b70: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
9b80: 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20  Journal) ){.    
9b90: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
9ba0: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
9bb0: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
9bc0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
9bd0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
9be0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
9bf0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
9c00: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9c10: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
9c20: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
9c30: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
9c40: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9c50: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
9c60: 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c  */.        OsFil
9c70: 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20  e journal;.     
9c80: 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20     int c;..     
9c90: 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e     memset(&journ
9ca0: 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f  al, 0, sizeof(jo
9cb0: 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20 20  urnal));.       
9cc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
9cd0: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75  penReadOnly(zJou
9ce0: 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b  rnal, &journal);
9cf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
9d00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9d10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
9d20: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9d30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72      }..        r
9d40: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
9d50: 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20  urnal(&journal, 
9d60: 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20  &zMasterPtr);.  
9d70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
9d80: 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a  lose(&journal);.
9d90: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
9da0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9db0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
9dc0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
9dd0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20     }..        c 
9de0: 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20  = zMasterPtr!=0 
9df0: 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65  && strcmp(zMaste
9e00: 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d  rPtr, zMaster)==
9e10: 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  0;.        sqlit
9e20: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72  eFree(zMasterPtr
9e30: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63  );.        if( c
9e40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
9e50: 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63 68   We have a match
9e60: 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  . Do not delete 
9e70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9e80: 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
9e90: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9ea0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9eb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9ec0: 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73    zJournal += (s
9ed0: 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b  trlen(zJournal)+
9ee0: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
9ef0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65  .  sqlite3OsDele
9f00: 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65  te(zMaster);..de
9f10: 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
9f20: 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
9f30: 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  l ){.    sqliteF
9f40: 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  ree(zMasterJourn
9f50: 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28  al);.  }  .  if(
9f60: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a   master_open ){.
9f70: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9f80: 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d  se(&master);.  }
9f90: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
9fa0: 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72  ./*.** Make ever
9fb0: 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  y page in the ca
9fc0: 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20 77  che agree with w
9fd0: 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20  hat is on disk. 
9fe0: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
9ff0: 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20 64  .** reread the d
a000: 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65  isk to reset the
a010: 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 61   state of the ca
a020: 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  che..**.** This 
a030: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a040: 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61  d after a rollba
a050: 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65  ck in which some
a060: 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63 61   of the dirty ca
a070: 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64  che.** pages had
a080: 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69 74   never been writ
a090: 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e  ten out to disk.
a0a0: 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c    We need to rol
a0b0: 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61  l back the.** ca
a0c0: 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20  che content and 
a0d0: 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  the easiest way 
a0e0: 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f  to do that is to
a0f0: 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20   reread the old 
a100: 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20  content.** back 
a110: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a  from the disk..*
a120: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a130: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
a140: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a150: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
a160: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
a170: 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  OK;.  for(pPg=pP
a180: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
a190: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
a1a0: 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  ll){.    char zB
a1b0: 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  uf[SQLITE_MAX_PA
a1c0: 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66  GE_SIZE];.    if
a1d0: 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20  ( !pPg->dirty ) 
a1e0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
a1f0: 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
a200: 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
a210: 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
a220: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
a230: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
a240: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
a250: 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b  )(pPg->pgno-1));
a260: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
a270: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
a280: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
a290: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a2a0: 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52 45        TRACE3("RE
a2b0: 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
a2c0: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
a2d0: 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
a2e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
a2f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f   break;.      CO
a300: 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75 66  DEC(pPager, zBuf
a310: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b  , pPg->pgno, 2);
a320: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a330: 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20 30    memset(zBuf, 0
a340: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
a350: 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ze);.    }.    i
a360: 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
a370: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20  || memcmp(zBuf, 
a380: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
a390: 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
a3a0: 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 6d  Size) ){.      m
a3b0: 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
a3c0: 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c 20  ATA(pPg), zBuf, 
a3d0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a3e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
a3f0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29  ger->xReiniter )
a400: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
a410: 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44  ->xReiniter(PGHD
a420: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
a430: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a440: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
a450: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
a460: 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
a470: 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70  g, pPager), 0, p
a480: 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
a490: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
a4a0: 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
a4b0: 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  = 0;.    pPg->di
a4c0: 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  rty = 0;.#ifdef 
a4d0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
a4e0: 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
a4f0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
a500: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
a510: 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  if.  }.  return 
a520: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
a530: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
a540: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
a550: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
a560: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
a570: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73   indicated..*/.s
a580: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
a590: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
a5a0: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
a5b0: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e){.  assert( pP
a5c0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
a5d0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  ER_EXCLUSIVE );.
a5e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
a5f0: 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
a600: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
a610: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
a620: 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  age);.}../*.** P
a630: 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75 72  layback the jour
a640: 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65 73  nal and thus res
a650: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
a660: 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65  e file to.** the
a670: 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69 6e   state it was in
a680: 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72 74   before we start
a690: 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65  ed making change
a6a0: 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  s.  .**.** The j
a6b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d  ournal file form
a6c0: 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  at is as follows
a6d0: 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38  : .**.**  (1)  8
a6e0: 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20 41   byte prefix.  A
a6f0: 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61   copy of aJourna
a700: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32  lMagic[]..**  (2
a710: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
a720: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
a730: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
a740: 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20 72   of valid page r
a750: 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20 20  ecords.**       
a760: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
a770: 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20 69   If this value i
a780: 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
a790: 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  en compute the.*
a7a0: 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20 6f  *       number o
a7b0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  f page records f
a7c0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a7d0: 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34  size..**  (3)  4
a7e0: 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
a7f0: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a800: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61  s the initial va
a810: 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20  lue for the .** 
a820: 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68 65        sanity che
a830: 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20  cksum..**  (4)  
a840: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
a850: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
a860: 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20 74  er of pages to t
a870: 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 20  runcate the.**  
a880: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74 6f       database to
a890: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
a8a0: 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20 62  ck..**  (5)  4 b
a8b0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
a8c0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
a8d0: 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
a8e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
a8f0: 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54  *       name.  T
a900: 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20  he value may be 
a910: 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74  zero (indicate t
a920: 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hat there is no 
a930: 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20  master.**       
a940: 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36  journal.).**  (6
a950: 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68  )  N bytes of th
a960: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
a970: 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65   name.  The name
a980: 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72   will be nul-ter
a990: 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20  minated.**      
a9a0: 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68   and might be sh
a9b0: 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76  orter than the v
a9c0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28  alue read from (
a9d0: 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73  5).  If the firs
a9e0: 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20  t byte.**       
a9f0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c  of the name is \
aa00: 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69  000 then there i
aa10: 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  s no master jour
aa20: 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72  nal.  The master
aa30: 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61  .**       journa
aa40: 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64  l name is stored
aa50: 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28   in UTF-8..**  (
aa60: 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65  7)  Zero or more
aa70: 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73   pages instances
aa80: 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77  , each as follow
aa90: 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  s:.**        +  
aaa0: 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62  4 byte page numb
aab0: 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  er..**        + 
aac0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
aad0: 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e  e bytes of data.
aae0: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
aaf0: 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a  byte checksum.**
ab00: 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61  .** When we spea
ab10: 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
ab20: 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e   header, we mean
ab30: 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74 65   the first 6 ite
ab40: 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63  ms above..** Eac
ab50: 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a  h entry in the j
ab60: 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73  ournal is an ins
ab70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74 68  tance of the 7th
ab80: 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c   item..**.** Cal
ab90: 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d  l the value from
aba0: 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c   the second bull
abb0: 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63  et "nRec".  nRec
abc0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
abd0: 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20  f.** valid page 
abe0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a  entries in the j
abf0: 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74  ournal.  In most
ac00: 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20   cases, you can 
ac10: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76  compute the.** v
ac20: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f  alue of nRec fro
ac30: 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
ac40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
ac50: 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a   But if a power.
ac60: 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  ** failure occur
ac70: 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f  red while the jo
ac80: 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20  urnal was being 
ac90: 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c  written, it coul
aca0: 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65  d be the.** case
acb0: 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f   that the size o
acc0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
acd0: 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62  le had already b
ace0: 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75  een increased bu
acf0: 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65  t.** the extra e
ad00: 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79  ntries had not y
ad10: 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c  et made it safel
ad20: 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73  y to disk.  In s
ad30: 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74  uch a case,.** t
ad40: 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  he value of nRec
ad50: 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
ad60: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75  he file size wou
ad70: 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e  ld be too large.
ad80: 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65    For.** that re
ad90: 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20  ason, we always 
ada0: 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  use the nRec val
adb0: 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ue in the header
adc0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
add0: 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66  Rec value is 0xf
ade0: 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73  fffffff it means
adf0: 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c   that nRec shoul
ae00: 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  d be computed.**
ae10: 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73   from the file s
ae20: 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65  ize.  This value
ae30: 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68   is used when th
ae40: 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74  e user selects t
ae50: 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70  he.** no-sync op
ae60: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75  tion for the jou
ae70: 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66  rnal.  A power f
ae80: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
ae90: 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a  d to corruption.
aea0: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
aeb0: 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73    But for things
aec0: 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20   like temporary 
aed0: 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c  table (which wil
aee0: 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20  l be.** deleted 
aef0: 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69  when the power i
af00: 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64  s restored) we d
af10: 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a  on't care.  .**.
af20: 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f  ** If the file o
af30: 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75  pened as the jou
af40: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
af50: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a   a well-formed.*
af60: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  * journal file t
af70: 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70  hen all pages up
af80: 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f   to the first co
af90: 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65  rrupted page are
afa0: 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20   rolled.** back 
afb0: 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20  (or no pages if 
afc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
afd0: 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29  er is corrupted)
afe0: 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  . The journal fi
aff0: 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65  le.** is then de
b000: 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45  leted and SQLITE
b010: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75  _OK returned, ju
b020: 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72  st as if no corr
b030: 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65  uption had.** be
b040: 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a  en encountered..
b050: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20  **.** If an I/O 
b060: 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f  or malloc() erro
b070: 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f  r occurs, the jo
b080: 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f  urnal-file is no
b090: 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64  t deleted.** and
b0a0: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
b0b0: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
b0c0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
b0d0: 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a  playback(Pager *
b0e0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73  pPager){.  i64 s
b0f0: 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
b100: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
b110: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
b120: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
b130: 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  2 nRec;         
b140: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b150: 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74   of Records in t
b160: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
b170: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
b180: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b190: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
b1a0: 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
b1b0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
b1c0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
b1d0: 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
b1e0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
b1f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b200: 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
b210: 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  ubroutine */.  c
b220: 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30  har *zMaster = 0
b230: 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  ;       /* Name 
b240: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
b250: 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f  l file if any */
b260: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
b270: 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
b280: 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a 6f  ds are in the jo
b290: 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65 61  urnal.  Abort ea
b2a0: 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65 20  rly if.  ** the 
b2b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74 79  journal is empty
b2c0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
b2d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b2e0: 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
b2f0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b300: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
b310: 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  szJ);.  if( rc!=
b320: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b330: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b340: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
b350: 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
b360: 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
b370: 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
b380: 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
b390: 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
b3a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
b3b0: 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
b3c0: 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
b3d0: 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
b3e0: 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
b3f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
b400: 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
b410: 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
b420: 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
b430: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64    */.  rc = read
b440: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70  MasterJournal(&p
b450: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61  Pager->jfd, &zMa
b460: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
b470: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
b480: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
b490: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73  LITE_OK || (zMas
b4a0: 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33 4f  ter && !sqlite3O
b4b0: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61 73  sFileExists(zMas
b4c0: 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71 6c  ter)) ){.    sql
b4d0: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29  iteFree(zMaster)
b4e0: 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
b4f0: 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  0;.    if( rc==S
b500: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63 20  QLITE_DONE ) rc 
b510: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b520: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b530: 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ck;.  }.  sqlite
b540: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
b550: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61 67  >jfd, 0);.  pPag
b560: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
b570: 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c   0;..  /* This l
b580: 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65  oop terminates e
b590: 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72  ither when the r
b5a0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
b5b0: 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a  call returns.  *
b5c0: 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72  * SQLITE_DONE or
b5d0: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
b5e0: 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28  urs. */.  while(
b5f0: 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65   1 ){..    /* Re
b600: 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  ad the next jour
b610: 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20  nal header from 
b620: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b630: 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  .  If there are.
b640: 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67      ** not enoug
b650: 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20  h bytes left in 
b660: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b670: 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20   for a complete 
b680: 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a  header, or.    *
b690: 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65  * it is corrupte
b6a0: 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73  d, then a proces
b6b0: 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64  s must of failed
b6c0: 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69   while writing i
b6d0: 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69  t..    ** This i
b6e0: 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67  ndicates nothing
b6f0: 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62   more needs to b
b700: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20  e rolled back.. 
b710: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72     */.    rc = r
b720: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
b730: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
b740: 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66  , &mxPg);.    if
b750: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b760: 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63  ){ .      if( rc
b770: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
b780: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
b790: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
b7a0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
b7b0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a  playback;.    }.
b7c0: 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
b7d0: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
b7e0: 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  hen this journal
b7f0: 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20   was created by 
b800: 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a  a process.    **
b810: 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73   working in no-s
b820: 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d  ync mode. This m
b830: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65  eans that the re
b840: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
b850: 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f  l.    ** file co
b860: 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c  nsists of pages,
b870: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
b880: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
b890: 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20  rs. Compute.    
b8a0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
b8b0: 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68  nRec based on th
b8c0: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20  is assumption.. 
b8d0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
b8e0: 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29  ec==0xffffffff )
b8f0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
b900: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b910: 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
b920: 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
b930: 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20      nRec = (szJ 
b940: 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  - JOURNAL_HDR_SZ
b950: 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41  (pPager))/JOURNA
b960: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b  L_PG_SZ(pPager);
b970: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
b980: 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
b990: 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20  rst header read 
b9a0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
b9b0: 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20  , truncate the. 
b9c0: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
b9d0: 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27 73  ile back to it's
b9e0: 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
b9f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
ba00: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
ba10: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
ba20: 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
ba30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f  ->journalOff==JO
ba40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ba50: 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61 73  ger) ){.      as
ba60: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
ba70: 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70  igDbSize==0 || p
ba80: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
ba90: 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20 20  e==mxPg );.     
baa0: 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
bab0: 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
bac0: 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
bad0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bae0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
baf0: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
bb00: 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
bb10: 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
bb20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20     }..    /* rc 
bb30: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
bb40: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f  &pPager->jfd, JO
bb50: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
bb60: 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66  ger)); */.    if
bb70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bb80: 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62  ) goto end_playb
bb90: 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43  ack;.  .    /* C
bba0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
bbb0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
bbc0: 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
bbd0: 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65  nto the database
bbe0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
bbf0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65    for(i=0; i<nRe
bc00: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  c; i++){.      r
bc10: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
bc20: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
bc30: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
bc40: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
bc50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
bc60: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
bc70: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
bc80: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
bc90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
bca0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
bcb0: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
bcc0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bcd0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
bce0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
bcf0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
bd00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
bd10: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67   }.  }..  /* Pag
bd20: 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65  es that have bee
bd30: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
bd40: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65 76   journal but nev
bd50: 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77  er synced.  ** w
bd60: 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72 65  here not restore
bd70: 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61 62  d by the loop ab
bd80: 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74 6f  ove.  We have to
bd90: 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a 20   restore those. 
bda0: 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65 61   ** pages by rea
bdb0: 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20 66  ding them back f
bdc0: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
bdd0: 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a   database..  */.
bde0: 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
bdf0: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67  LITE_OK );.  pag
be00: 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
be10: 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c  pPager);..end_pl
be20: 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63  ayback:.  if( rc
be30: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
be40: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e     rc = pager_un
be50: 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
be60: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61  );.  }.  if( zMa
be70: 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ster ){.    /* I
be80: 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d 61  f there was a ma
be90: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ster journal and
bea0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
beb0: 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c 0a  ll return true,.
bec0: 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
bed0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
bee0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
bef0: 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
bf00: 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
bf10: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bf20: 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d   rc = pager_delm
bf30: 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a  aster(zMaster);.
bf40: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
bf50: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
bf60: 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67   }..  /* The Pag
bf70: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61  er.sectorSize va
bf80: 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20  riable may have 
bf90: 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69  been updated whi
bfa0: 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20  le rolling.  ** 
bfb0: 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63  back a journal c
bfc0: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
bfd0: 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65  ess with a diffe
bfe0: 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f  rent PAGER_SECTO
bff0: 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75  R_SIZE.  ** valu
c000: 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20 74  e. Reset it to t
c010: 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65  he correct value
c020: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
c030: 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  s..  */.  pPager
c040: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50  ->sectorSize = P
c050: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
c060: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c070: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
c080: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c090: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
c0a0: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
c0b0: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
c0c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
c0d0: 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a  urnal but with.*
c0e0: 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74 77  * a few extra tw
c0f0: 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ists..**.**    (
c100: 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f  1)  The number o
c110: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
c120: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
c130: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
c140: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 74          the stat
c150: 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20  ement is stored 
c160: 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  in pPager->stmtS
c170: 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a  ize, not in the.
c180: 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e  **         journ
c190: 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a  al file itself..
c1a0: 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e  **.**    (2)  In
c1b0: 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61   addition to pla
c1c0: 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74  ying back the st
c1d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c  atement journal,
c1e0: 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20   also.**        
c1f0: 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61   playback all pa
c200: 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73  ges of the trans
c210: 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62  action journal b
c220: 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20  eginning.**     
c230: 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70 50      at offset pP
c240: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e  ager->stmtJSize.
c250: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
c260: 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
c270: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
c280: 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20  ){.  i64 szJ;   
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c2a0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c   Size of the ful
c2b0: 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  l journal */.  i
c2c0: 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74  64 hdrOff;.  int
c2d0: 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20   nRec;          
c2e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
c2f0: 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20  of Records */.  
c300: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
c310: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
c320: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
c330: 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70  t rc;..  szJ = p
c340: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c350: 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  f;.#ifndef NDEBU
c360: 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f  G .  {.    i64 o
c370: 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20  s_szJ;.    rc = 
c380: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
c390: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
c3a0: 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
c3b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
c3c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
c3d0: 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
c3e0: 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
c3f0: 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
c400: 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
c410: 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72 73  fset to the firs
c420: 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
c430: 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68   written.  ** th
c440: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
c450: 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65  nsaction, or the
c460: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
c470: 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20   if no journal. 
c480: 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20 77   ** header was w
c490: 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68  ritten..  */.  h
c4a0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
c4b0: 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73  stmtHdrOff;.  as
c4c0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75  sert( pPager->fu
c4d0: 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66  llSync || !hdrOf
c4e0: 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f  f );.  if( !hdrO
c4f0: 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66  ff ){.    hdrOff
c500: 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20   = szJ;.  }.  . 
c510: 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65   /* Truncate the
c520: 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74   database back t
c530: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
c540: 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ize..  */.  if( 
c550: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
c560: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
c570: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c580: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
c590: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  , pPager->stmtSi
c5a0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ze);.  }.  pPage
c5b0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
c5c0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
c5d0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
c5e0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
c5f0: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
c600: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
c610: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
c620: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
c630: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
c640: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
c650: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
c660: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
c670: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
c680: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
c690: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
c6a0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
c6b0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
c6c0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
c6d0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
c6e0: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
c6f0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
c700: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
c710: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
c720: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
c730: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
c740: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
c750: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
c760: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
c770: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
c780: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
c790: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
c7a0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c7b0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c7c0: 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20   &pPager->stfd, 
c7d0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
c7e0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
c7f0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
c800: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
c810: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
c820: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  k;.  }..  /* Now
c830: 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73   roll some pages
c840: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74   back from the t
c850: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
c860: 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53  al. Pager.stmtJS
c870: 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65  ize.  ** was the
c880: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
c890: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74  rnal file when t
c8a0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61  his statement wa
c8b0: 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20  s started, so.  
c8c0: 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66  ** everything af
c8d0: 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74  ter that needs t
c8e0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
c8f0: 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  , either into th
c900: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
c910: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68   the memory cach
c920: 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  e, or both..  **
c930: 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  .  ** If it is n
c940: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61  ot zero, then Pa
c950: 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69  ger.stmtHdrOff i
c960: 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  s the offset to 
c970: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
c980: 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  f the first jour
c990: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
c9a0: 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73  en during this s
c9b0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
c9c0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
c9d0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
c9e0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
c9f0: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
ca00: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ca10: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
ca20: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
ca30: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
ca40: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
ca50: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
ca60: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73  e;.  pPager->cks
ca70: 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d  umInit = pPager-
ca80: 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73  >stmtCksum;.  as
ca90: 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44  sert( JOURNAL_HD
caa0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50  R_SZ(pPager)<(pP
cab0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
cac0: 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  ) );.  while( pP
cad0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cae0: 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61   <= (hdrOff-(pPa
caf0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
cb00: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ) ){.    rc = pa
cb10: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
cb20: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
cb30: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
cb40: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
cb50: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
cb60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cb70: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
cb80: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
cb90: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
cba0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
cbb0: 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
cbc0: 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20 64   nRec;.    u32 d
cbd0: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
cbe0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
cbf0: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
cc00: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
cc10: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cc20: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cc30: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
cc40: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
cc50: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
cc60: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
cc70: 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nRec==0 ){.    
cc80: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
cc90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cca0: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
ccb0: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
ccc0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65 63  }.    for(i=nRec
ccd0: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
cce0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
ccf0: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
cd00: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
cd10: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
cd20: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
cd30: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
cd40: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
cd50: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
cd60: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cd70: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
cd80: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
cd90: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
cda0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
cdb0: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
cdc0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
cdd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cde0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
cdf0: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
ce00: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
ce10: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
ce20: 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52  T;  /* bkpt-CORR
ce30: 55 50 54 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  UPT */.  }else{.
ce40: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
ce50: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
ce60: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
ce70: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
ce80: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
ce90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
cea0: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
ceb0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
cec0: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
ced0: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a  are allowed..**.
cee0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
cef0: 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62 73  umber is the abs
cf00: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74  olute value of t
cf10: 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d 65  he mxPage parame
cf20: 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67  ter..** If mxPag
cf30: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
cf40: 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  he noSync flag i
cf50: 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53  s also set.  noS
cf60: 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a 20  ync bypasses.** 
cf70: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
cf80: 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70  OsSync().  The p
cf90: 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66  ager runs much f
cfa0: 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e  aster with noSyn
cfb0: 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20  c on,.** but if 
cfc0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
cfd0: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
cfe0: 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75  there is an abru
cff0: 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69  pt power .** fai
d000: 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61  lure, the databa
d010: 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  se file might be
d020: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
d030: 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20  nsistent and.** 
d040: 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61  unrepairable sta
d050: 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  te.  .*/.void sq
d060: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
d070: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
d080: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
d090: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
d0a0: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
d0b0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
d0c0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
d0d0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
d0e0: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
d0f0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20  needSync = 0; . 
d100: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
d110: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
d120: 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78      mxPage = -mx
d130: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
d140: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
d150: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
d160: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
d170: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
d180: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
d190: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
d1a0: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
d1b0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
d1c0: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
d1d0: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
d1e0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
d1f0: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
d200: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
d210: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
d220: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
d230: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
d240: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
d250: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
d260: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
d270: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
d280: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
d290: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
d2a0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
d2b0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
d2c0: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
d2d0: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
d2e0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
d2f0: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
d300: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
d310: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
d320: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
d330: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
d340: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
d350: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
d360: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
d370: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
d380: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
d390: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
d3a0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d3b0: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
d3c0: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
d3d0: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
d3e0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
d3f0: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
d400: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
d410: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
d420: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
d440: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
d450: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
d460: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
d470: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
d480: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
d490: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
d4a0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
d4b0: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
d4c0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
d4d0: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
d4e0: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
d4f0: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
d500: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
d510: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
d520: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
d530: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
d540: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
d550: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
d560: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
d570: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
d580: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
d590: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
d5a0: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
d5b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
d5c0: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
d5d0: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
d5e0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
d5f0: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
d600: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
d610: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
d620: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
d630: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
d640: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
d650: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
d660: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
d670: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
d680: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
d690: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
d6a0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
d6b0: 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
d6c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
d6d0: 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50  t_safety_level(P
d6e0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
d6f0: 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67  t level){.  pPag
d700: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65  er->noSync =  le
d710: 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72  vel==1 || pPager
d720: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  ->tempFile;.  pP
d730: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
d740: 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50   level==3 && !pP
d750: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
d760: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
d770: 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
d780: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
d790: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
d7a0: 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
d7b0: 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e  le.  Write the n
d7c0: 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
d7d0: 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a  into zName.** (z
d7e0: 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74 20  Name must be at 
d7f0: 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45 4d  least SQLITE_TEM
d800: 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65 73  PNAME_SIZE bytes
d810: 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a   long.)  Write.*
d820: 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  * the file descr
d830: 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
d840: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
d850: 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
d860: 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
d870: 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
d880: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f  ail..**.** The O
d890: 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63  S will automatic
d8a0: 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20  ally delete the 
d8b0: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 77  temporary file w
d8c0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f  hen it is.** clo
d8d0: 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  sed..*/.static i
d8e0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
d8f0: 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a  opentemp(char *z
d900: 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64  File, OsFile *fd
d910: 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 38  ){.  int cnt = 8
d920: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f  ;.  int rc;.  do
d930: 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20  {.    cnt--;.   
d940: 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69   sqlite3OsTempFi
d950: 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20  leName(zFile);. 
d960: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
d970: 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 7a  sOpenExclusive(z
d980: 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20  File, fd, 1);.  
d990: 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26 26  }while( cnt>0 &&
d9a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
d9b0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
d9c0: 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  EM );.  return r
d9d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
d9e0: 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
d9f0: 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
da00: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
da10: 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
da20: 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
da30: 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
da40: 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
da50: 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
da60: 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
da70: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
da80: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
da90: 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20  t() and is only 
daa0: 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20  held open until 
dab0: 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65  the.** last page
dac0: 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69   is released usi
dad0: 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ng sqlite3pager_
dae0: 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49  unref()..**.** I
daf0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e  f zFilename is N
db00: 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f  ULL then a rando
db10: 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72  mly-named tempor
db20: 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65 61  ary file is crea
db30: 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20  ted.** and used 
db40: 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  as the file to b
db50: 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20 66  e cached.  The f
db60: 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65  ile will be dele
db70: 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63  ted.** automatic
db80: 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20  ally when it is 
db90: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  closed..**.** If
dba0: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a   zFilename is ":
dbb0: 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c  memory:" then al
dbc0: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  l information is
dbd0: 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a   held in cache..
dbe0: 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20 77  ** It is never w
dbf0: 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20  ritten to disk. 
dc00: 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73 65   This can be use
dc10: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61  d to implement a
dc20: 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  n.** in-memory d
dc30: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
dc40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
dc50: 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50  n(.  Pager **ppP
dc60: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a  ager,         /*
dc70: 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
dc80: 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
dc90: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
dca0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
dcb0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
dcc0: 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
dcd0: 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
dce0: 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
dcf0: 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
dd00: 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
dd10: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
dd20: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd40: 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
dd50: 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29  g this file */.)
dd60: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
dd70: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c  r;.  char *zFull
dd80: 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20  Pathname = 0;.  
dd90: 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f  int nameLen;.  O
dda0: 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20  sFile fd;.  int 
ddb0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ddc0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74    int i;.  int t
ddd0: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69  empFile = 0;.  i
dde0: 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20  nt memDb = 0;.  
ddf0: 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
de00: 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e  ;.  int useJourn
de10: 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  al = (flags & PA
de20: 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c  GER_OMIT_JOURNAL
de30: 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65  )==0;.  int noRe
de40: 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20  adlock = (flags 
de50: 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c  & PAGER_NO_READL
de60: 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72 20  OCK)!=0;.  char 
de70: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
de80: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20  PNAME_SIZE];..  
de90: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20  *ppPager = 0;.  
dea0: 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73  memset(&fd, 0, s
deb0: 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66  izeof(fd));.  if
dec0: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
ded0: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
dee0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
def0: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
df00: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
df10: 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
df20: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
df30: 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
df40: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
df50: 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
df60: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
df70: 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50   1;.      zFullP
df80: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
df90: 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20  StrDup("");.    
dfa0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
dfb0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
dfc0: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
dfd0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
dfe0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
dff0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
e000: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
e010: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
e020: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e030: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
e040: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
e050: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
e060: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e070: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
e080: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
e090: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64  ntemp(zTemp, &fd
e0a0: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
e0b0: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
e0c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
e0d0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
e0e0: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
e0f0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
e100: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74  TE_OK ){.      t
e110: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
e120: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46   }.  }.  if( !zF
e130: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
e140: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
e150: 65 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74 75  e(&fd);.    retu
e160: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
e170: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
e180: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e190: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
e1a0: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
e1b0: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
e1c0: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
e1d0: 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e  c;.  }.  nameLen
e1e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
e1f0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
e200: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
e210: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
e220: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b  r) + nameLen*3 +
e230: 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61   30 );.  if( pPa
e240: 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ger==0 ){.    sq
e250: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
e260: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
e270: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
e280: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e290: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
e2a0: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64   TRACE3("OPEN %d
e2b0: 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
e2c0: 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
e2d0: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
e2e0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
e2f0: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
e300: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
e310: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
e320: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
e330: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
e340: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
e350: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e360: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
e370: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
e380: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
e390: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
e3a0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
e3b0: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
e3c0: 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  name);.  for(i=n
e3d0: 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70  ameLen; i>0 && p
e3e0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e3f0: 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
e400: 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
e410: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e420: 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73  ry[i-1] = 0;.  s
e430: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  trcpy(pPager->zJ
e440: 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74  ournal, zFullPat
e450: 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  hname);.  sqlite
e460: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
e470: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70  me);.  strcpy(&p
e480: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
e490: 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72  nameLen], "-jour
e4a0: 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal");.  pPager-
e4b0: 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f 53  >fd = fd;.#if OS
e4c0: 5f 55 4e 49 58 0a 20 20 70 50 61 67 65 72 2d 3e  _UNIX.  pPager->
e4d0: 66 64 2e 70 50 61 67 65 72 20 3d 20 70 50 61 67  fd.pPager = pPag
e4e0: 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61  er;.#endif.  pPa
e4f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
e500: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e510: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
e520: 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
e530: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  b;.  pPager->noR
e540: 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64  eadlock = noRead
e550: 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
e560: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
e570: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67  Open = 0;.  pPag
e580: 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
e590: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
e5a0: 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
e5b0: 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d  >dbSize = memDb-
e5c0: 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  1;.  pPager->pag
e5d0: 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44  eSize = SQLITE_D
e5e0: 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
e5f0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
e600: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
e610: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
e620: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  0;.  pPager->nPa
e630: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
e640: 2d 3e 6e 4d 61 78 50 61 67 65 20 3d 20 30 3b 0a  ->nMaxPage = 0;.
e650: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
e660: 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
e670: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
e680: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
e690: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20  ->errMask = 0;. 
e6a0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
e6b0: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
e6c0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
e6d0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
e6e0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
e6f0: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
e700: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
e710: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
e720: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
e730: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
e740: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
e750: 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
e760: 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70  noSync?0:1);.  p
e770: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
e780: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
e790: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
e7a0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
e7b0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   0;.  pPager->nE
e7c0: 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
e7d0: 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
e7e0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
e7f0: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
e800: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  TOR_SIZE;.  pPag
e810: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
e820: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70   = 0;.  memset(p
e830: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
e840: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
e850: 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61  aHash));.  *ppPa
e860: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
e870: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e880: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
e890: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
e8a0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
e8b0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
e8c0: 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50  et_busyhandler(P
e8d0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
e8e0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
e8f0: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
e900: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
e910: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
e920: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
e930: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
e940: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
e950: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
e960: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
e970: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
e980: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
e990: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
e9a0: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
e9b0: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
e9c0: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
e9d0: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
e9e0: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
e9f0: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
ea00: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
ea10: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
ea20: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
ea30: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
ea40: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
ea50: 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
ea60: 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
ea70: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61  led by sqlite3pa
ea80: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a  ger_unref()..*/.
ea90: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
eaa0: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
eab0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
eac0: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
ead0: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
eae0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
eaf0: 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
eb00: 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
eb10: 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
eb20: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
eb30: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
eb40: 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
eb50: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
eb60: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
eb70: 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
eb80: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
eb90: 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
eba0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
ebb0: 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
ebc0: 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
ebd0: 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
ebe0: 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
ebf0: 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
ec00: 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
ec10: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
ec20: 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
ec30: 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
ec40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
ec50: 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  _reiniter(Pager 
ec60: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
ec70: 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69  xReinit)(void*,i
ec80: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
ec90: 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
eca0: 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
ecb0: 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
ecc0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77    Return the new
ecd0: 20 73 69 7a 65 2e 20 20 49 66 20 74 68 65 20 73   size.  If the s
ece0: 75 67 67 65 73 74 20 6e 65 77 20 70 61 67 65 0a  uggest new page.
ecf0: 2a 2a 20 73 69 7a 65 20 69 73 20 69 6e 61 70 70  ** size is inapp
ed00: 72 6f 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61  ropriate, then a
ed10: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61  n alternative pa
ed20: 67 65 20 73 69 7a 65 20 69 73 20 73 65 6c 65 63  ge size is selec
ed30: 74 65 64 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  ted.** and retur
ed40: 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
ed50: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67  te3pager_set_pag
ed60: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
ed70: 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a  ger, int pageSiz
ed80: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61  e){.  assert( pa
ed90: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
eda0: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
edb0: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b  MAX_PAGE_SIZE );
edc0: 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
edd0: 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 70 50 61  memDb ){.    pPa
ede0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  ger->pageSize = 
edf0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  pageSize;.  }.  
ee00: 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
ee10: 61 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ageSize;.}../*.*
ee20: 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
ee30: 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
ee40: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
ee50: 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
ee60: 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
ee70: 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e 6f  t points to.  No
ee80: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
ee90: 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64  is done..*/.void
eea0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65   sqlite3pager_re
eeb0: 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50 61  ad_fileheader(Pa
eec0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
eed0: 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61   N, unsigned cha
eee0: 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65 6d  r *pDest){.  mem
eef0: 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
ef00: 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30  ;.  if( MEMDB==0
ef10: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
ef20: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
ef30: 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  d, 0);.    sqlit
ef40: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
ef50: 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29 3b  ->fd, pDest, N);
ef60: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
ef70: 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e  turn the total n
ef80: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
ef90: 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
efa0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
efb0: 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e  ** pPager..*/.in
efc0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  t sqlite3pager_p
efd0: 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a  agecount(Pager *
efe0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6e  pPager){.  i64 n
eff0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
f000: 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
f010: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
f020: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
f030: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
f040: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
f050: 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
f060: 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51 4c  er->fd, &n)!=SQL
f070: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
f080: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
f090: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 3b   PAGER_ERR_DISK;
f0a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
f0b0: 20 7d 0a 20 20 6e 20 2f 3d 20 70 50 61 67 65 72   }.  n /= pPager
f0c0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69 66  ->pageSize;.  if
f0d0: 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 3d 3d 50  ( !MEMDB && n==P
f0e0: 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
f0f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
f100: 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69      n++;.  }.  i
f110: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
f120: 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
f130: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
f140: 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20  Size = n;.  }.  
f150: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
f160: 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  ** Forward decla
f170: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
f180: 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
f190: 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a 2a  (Pager*);.../*.*
f1a0: 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
f1b0: 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69  m it's hash chai
f1c0: 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20  n. Also set the 
f1d0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30  page number to 0
f1e0: 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20   to indicate.** 
f1f0: 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
f200: 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79   not part of any
f210: 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69   hash chain. Thi
f220: 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  s is required be
f230: 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c  cause the.** sql
f240: 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61  ite3pager_movepa
f250: 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e  ge() routine can
f260: 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e   leave a page in
f270: 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72   the .** pNextFr
f280: 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73  ee/pPrevFree lis
f290: 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
f2a0: 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
f2b0: 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69  -chain..*/.stati
f2c0: 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73  c void unlinkHas
f2d0: 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50  hChain(Pager *pP
f2e0: 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
f2f0: 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  ){.  if( pPg->pg
f300: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  no==0 ){.    /* 
f310: 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  If the page numb
f320: 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  er is zero, then
f330: 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6e 6f   this page is no
f340: 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63 68  t in any hash ch
f350: 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ain. */.    retu
f360: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rn;.  }.  if( pP
f370: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a  g->pNextHash ){.
f380: 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
f390: 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  sh->pPrevHash = 
f3a0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b 0a  pPg->pPrevHash;.
f3b0: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
f3c0: 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20 20  PrevHash ){.    
f3d0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f3e0: 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68  aHash[pager_hash
f3f0: 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70 50  (pPg->pgno)]!=pP
f400: 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  g );.    pPg->pP
f410: 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61  revHash->pNextHa
f420: 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48  sh = pPg->pNextH
f430: 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ash;.  }else{.  
f440: 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72 5f    int h = pager_
f450: 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 3b  hash(pPg->pgno);
f460: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
f470: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d 70  ger->aHash[h]==p
f480: 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  Pg );.    pPager
f490: 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
f4a0: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
f4b0: 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  ..  pPg->pgno = 
f4c0: 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
f4d0: 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
f4e0: 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
f4f0: 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
f500: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
f510: 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
f520: 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
f530: 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
f540: 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
f550: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
f560: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
f570: 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
f580: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
f590: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
f5a0: 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65 70  ager;..  /* Keep
f5b0: 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63 65   the pFirstSynce
f5c0: 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 69  d pointer pointi
f5d0: 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74 20  ng at the first 
f5e0: 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61 67  synchronized pag
f5f0: 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d  e */.  if( pPg==
f600: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
f610: 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64  nced ){.    PgHd
f620: 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65 78  r *p = pPg->pNex
f630: 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c 65  tFree;.    while
f640: 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79  ( p && p->needSy
f650: 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65  nc ){ p = p->pNe
f660: 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70 50  xtFree; }.    pP
f670: 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
f680: 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 2f  ed = p;.  }..  /
f690: 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
f6a0: 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
f6b0: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
f6c0: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
f6d0: 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
f6e0: 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
f6f0: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
f700: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
f710: 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20 29  r->pFirst==pPg )
f720: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46  ;.    pPager->pF
f730: 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  irst = pPg->pNex
f740: 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66 28  tFree;.  }.  if(
f750: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
f760: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
f770: 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65  tFree->pPrevFree
f780: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
f790: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
f7a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f7b0: 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pLast==pPg );.  
f7c0: 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
f7d0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
f7e0: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
f7f0: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50  xtFree = pPg->pP
f800: 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20 20  revFree = 0;..  
f810: 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
f820: 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
f830: 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  le */.  unlinkHa
f840: 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
f850: 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  pPg);.}..#ifndef
f860: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
f870: 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORYDB./*.** This
f880: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
f890: 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e 20   to truncate an 
f8a0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
f8b0: 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61  se.  Delete.** a
f8c0: 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
f8d0: 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74 68  gno is larger th
f8e0: 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
f8f0: 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72  e and is unrefer
f900: 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65  enced..** Refere
f910: 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67 65  nced pages large
f920: 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
f930: 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65 64  bSize are zeroed
f940: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f950: 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
f960: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
f970: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
f980: 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
f990: 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
f9a0: 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
f9b0: 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
f9c0: 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
f9d0: 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
f9e0: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
f9f0: 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
fa00: 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
fa10: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
fa20: 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
fa30: 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
fa40: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
fa50: 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
fa60: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
fa70: 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
fa80: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
fa90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
faa0: 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
fab0: 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69  tAll;.      unli
fac0: 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
fad0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
fae0: 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
faf0: 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d  ->nPage--;.    }
fb00: 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64 65  .  }.}.#else.#de
fb10: 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e 63  fine memoryTrunc
fb20: 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a 2f  ate(p).#endif../
fb30: 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61  *.** Try to obta
fb40: 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66  in a lock on a f
fb50: 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65  ile.  Invoke the
fb60: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69   busy callback i
fb70: 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73  f the lock.** is
fb80: 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61   currently not a
fb90: 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61  vailable.  Repea
fba0: 74 65 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  te until the bus
fbb0: 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
fbc0: 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
fbd0: 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
fbe0: 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
fbf0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
fc00: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
fc10: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
fc20: 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
fc30: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
fc40: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
fc50: 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
fc60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
fc70: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
fc80: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
fc90: 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
fca0: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
fcb0: 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
fcc0: 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
fcd0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
fce0: 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
fcf0: 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
fd00: 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
fd10: 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
fd20: 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
fd30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
fd40: 65 7b 0a 20 20 20 20 69 6e 74 20 62 75 73 79 20  e{.    int busy 
fd50: 3d 20 31 3b 0a 20 20 20 20 42 75 73 79 48 61 6e  = 1;.    BusyHan
fd60: 64 6c 65 72 20 2a 70 48 3b 0a 20 20 20 20 64 6f  dler *pH;.    do
fd70: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
fd80: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
fd90: 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
fda0: 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
fdb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
fdc0: 26 26 20 0a 20 20 20 20 20 20 20 20 28 70 48 20  && .        (pH 
fdd0: 3d 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48  = pPager->pBusyH
fde0: 61 6e 64 6c 65 72 29 21 3d 30 20 26 26 20 0a 20  andler)!=0 && . 
fdf0: 20 20 20 20 20 20 20 70 48 2d 3e 78 46 75 6e 63         pH->xFunc
fe00: 20 26 26 20 70 48 2d 3e 78 46 75 6e 63 28 70 48   && pH->xFunc(pH
fe10: 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29 0a  ->pArg, busy++).
fe20: 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
fe30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fe40: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
fe50: 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ate = locktype;.
fe60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
fe70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
fe80: 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  Truncate the fil
fe90: 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
fea0: 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69  of pages specifi
feb0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
fec0: 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
fed0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fee0: 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69  Pgno nPage){.  i
fef0: 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
ff00: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
ff10: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
ff20: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
ff30: 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
ff40: 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
ff50: 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
ff60: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50  rc;.  }.  if( nP
ff70: 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70  age>=(unsigned)p
ff80: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
ff90: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ffa0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
ffb0: 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
ffc0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
ffd0: 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79  Page;.    memory
ffe0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29  Truncate(pPager)
fff0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
10000 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63  ITE_OK;.  }.  rc
10010 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
10020 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
10030 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10040 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10050 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65  }..  /* Get an e
10060 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e  xclusive lock on
10070 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
10080 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e  fore truncating.
10090 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72   */.  rc = pager
100a0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
100b0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
100c0 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21  LOCK);.  if( rc!
100d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
100e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
100f0 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  ..  rc = pager_t
10100 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
10110 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  nPage);.  if( rc
10120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10130 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
10140 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20  e = nPage;.  }. 
10150 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
10160 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
10170 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
10180 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
10190 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
101a0 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
101b0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
101c0 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
101d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
101e0 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
101f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
10200 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
10210 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
10220 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
10230 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
10240 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
10250 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
10260 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
10270 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
10280 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
10290 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
102a0 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
102b0 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
102c0 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
102d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
102e0 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20  ger_close(Pager 
102f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
10300 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a  r *pPg, *pNext;.
10310 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72    switch( pPager
10320 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63  ->state ){.    c
10330 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56  ase PAGER_RESERV
10340 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47  ED:.    case PAG
10350 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20  ER_SYNCED: .    
10360 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55  case PAGER_EXCLU
10370 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  SIVE: {.      /*
10380 20 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 49   We ignore any I
10390 4f 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63  O errors that oc
103a0 63 75 72 20 64 75 72 69 6e 67 20 74 68 65 20 72  cur during the r
103b0 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a  ollback.      **
103c0 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64   operation. So d
103d0 69 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72 20  isable IO error 
103e0 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68  simulation so th
103f0 61 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20 20  at testing.     
10400 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65   ** works more e
10410 61 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  asily..      */.
10420 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
10430 54 45 5f 54 45 53 54 29 20 26 26 20 28 64 65 66  TE_TEST) && (def
10440 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c  ined(OS_UNIX) ||
10450 20 64 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29   defined(OS_WIN)
10460 29 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 69  ).      extern i
10470 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
10480 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20  ror_pending;.   
10490 20 20 20 69 6e 74 20 69 6f 65 72 72 5f 63 6e 74     int ioerr_cnt
104a0 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
104b0 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20  ror_pending;.   
104c0 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72     sqlite3_io_er
104d0 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
104e0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73  ;.#endif.      s
104f0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
10500 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 23 69  back(pPager);.#i
10510 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
10520 5f 54 45 53 54 29 20 26 26 20 28 64 65 66 69 6e  _TEST) && (defin
10530 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64  ed(OS_UNIX) || d
10540 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a  efined(OS_WIN)).
10550 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f        sqlite3_io
10560 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d  _error_pending =
10570 20 69 6f 65 72 72 5f 63 6e 74 3b 0a 23 65 6e 64   ioerr_cnt;.#end
10580 69 66 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45  if.      if( !ME
10590 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73  MDB ){.        s
105a0 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
105b0 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
105c0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
105d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
105e0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 70  er->errMask || p
105f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
10600 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62  en==0 );.      b
10610 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
10620 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45  case PAGER_SHARE
10630 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  D: {.      if( !
10640 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
10650 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
10660 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
10670 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
10680 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10690 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
106a0 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  {.      /* Do no
106b0 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62  thing */.      b
106c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
106d0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
106e0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
106f0 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66  =pNext){.#ifndef
10700 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28 20   NDEBUG.    if( 
10710 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
10720 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
10730 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
10740 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
10750 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
10760 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
10770 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
10780 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
10790 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
107a0 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
107b0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
107c0 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
107d0 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
107e0 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
107f0 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f   }.  TRACE2("CLO
10800 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  SE %d\n", PAGERI
10810 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73  D(pPager));.  as
10820 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
10830 72 4d 61 73 6b 20 7c 7c 20 28 70 50 61 67 65 72  rMask || (pPager
10840 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
10850 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   && pPager->stmt
10860 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66  Open==0) );.  if
10870 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
10880 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  lOpen ){.    sql
10890 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
108a0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20  ger->jfd);.  }. 
108b0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
108c0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
108d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
108e0 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  tmtOpen ){.    s
108f0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
10900 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
10910 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
10920 73 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b  se(&pPager->fd);
10930 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
10940 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
10950 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
10960 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
10970 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
10980 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
10990 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
109a0 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
109b0 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69  * }.  */..  sqli
109c0 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
109d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
109e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
109f0 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
10a00 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
10a10 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
10a20 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65  Pgno sqlite3page
10a30 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
10a40 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
10a50 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
10a60 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
10a70 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
10a80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
10a90 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
10aa0 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
10ab0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
10ac0 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
10ad0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
10ae0 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
10af0 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
10b00 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
10b10 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
10b20 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
10b30 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
10b40 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
10b50 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
10b60 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
10b70 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
10b80 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
10b90 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
10ba0 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
10bb0 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
10bc0 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
10bd0 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
10be0 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
10bf0 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
10c00 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
10c10 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
10c20 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
10c30 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
10c40 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
10c50 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
10c60 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
10c70 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
10c80 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
10c90 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
10ca0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
10cb0 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
10cc0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
10cd0 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
10ce0 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
10cf0 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
10d00 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
10d10 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
10d20 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
10d30 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
10d40 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
10d50 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
10d60 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
10d70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
10d80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10d90 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
10da0 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
10db0 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
10dc0 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
10dd0 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
10de0 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
10df0 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
10e00 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
10e10 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
10e20 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
10e30 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
10e40 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
10e50 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
10e60 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
10e70 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
10e80 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
10e90 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
10ea0 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
10eb0 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
10ec0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
10ed0 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
10ee0 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
10ef0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
10f00 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
10f10 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
10f20 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
10f30 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
10f40 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
10f50 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
10f60 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
10f70 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
10f80 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
10f90 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
10fa0 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
10fb0 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
10fc0 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
10fd0 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
10fe0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
10ff0 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  r_ref(void *pDat
11000 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
11010 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
11020 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f  (pData);.  page_
11030 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
11040 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11050 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
11060 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
11070 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
11080 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
11090 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
110a0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
110b0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
110c0 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
110d0 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
110e0 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
110f0 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
11100 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
11110 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
11120 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
11130 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
11140 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
11150 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
11160 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
11170 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
11180 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
11190 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
111a0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
111b0 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
111c0 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
111d0 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
111e0 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
111f0 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
11200 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
11210 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
11220 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
11230 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
11240 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
11250 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
11260 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
11270 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
11280 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
11290 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
112a0 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
112b0 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
112c0 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
112d0 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
112e0 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
112f0 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
11300 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
11310 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
11320 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
11330 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
11340 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
11350 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
11360 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
11370 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
11380 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
11390 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
113a0 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
113b0 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
113c0 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
113d0 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20  ailure, so sync 
113e0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
113f0 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
11400 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  s the needSync f
11410 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61  ield of every pa
11420 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20  ge current held 
11430 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  in.** memory..*/
11440 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
11450 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
11460 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
11470 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
11480 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
11490 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
114a0 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
114b0 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
114c0 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
114d0 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
114e0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
114f0 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
11500 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
11510 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
11520 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
11530 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
11540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
11550 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
11560 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73  n );.      /* as
11570 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e  sert( !pPager->n
11580 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79  oSync ); // noSy
11590 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20  nc might be set 
115a0 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  if synchronous. 
115b0 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e       ** was turn
115c0 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65  ed off after the
115d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
115e0 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65   started.  Ticke
115f0 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65  t #615 */.#ifnde
11600 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b  f NDEBUG.      {
11610 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
11620 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72   sure the pPager
11630 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77  ->nRec counter w
11640 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67  e are keeping ag
11650 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  rees.        ** 
11660 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f  with the nRec co
11670 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
11680 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
11690 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
116a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
116b0 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63   jSz;.        rc
116c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
116d0 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
116e0 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
116f0 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
11700 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
11710 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
11720 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
11730 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
11740 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
11750 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
11760 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
11770 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
11780 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
11790 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
117a0 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
117b0 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
117c0 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
117d0 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
117e0 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
117f0 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
11800 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
11810 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
11820 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
11830 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
11840 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
11850 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
11860 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
11870 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
11880 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53         TRACE2("S
11890 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
118a0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
118b0 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
118c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
118d0 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
118e0 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
118f0 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
11900 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
11910 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11920 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
11930 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
11940 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
11950 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
11960 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
11970 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
11980 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
11990 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
119a0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
119b0 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
119c0 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
119d0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
119e0 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
119f0 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32    }.      TRACE2
11a00 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
11a10 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
11a20 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
11a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
11a40 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
11a50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11a60 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
11a70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11a80 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
11a90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
11aa0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
11ab0 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
11ac0 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
11ad0 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
11ae0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
11af0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
11b00 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
11b10 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
11b20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
11b30 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
11b40 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
11b50 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
11b60 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  First;.  }..#ifn
11b70 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
11b80 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
11b90 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c  dSync flag is cl
11ba0 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48  ear then the PgH
11bb0 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a  dr.needSync.  **
11bc0 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20   flag must also 
11bd0 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c  be clear for all
11be0 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20   pages.  Verify 
11bf0 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
11c00 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65  nvariant is true
11c10 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
11c20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
11c30 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
11c40 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
11c50 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
11c60 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
11c70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
11c80 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
11c90 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
11ca0 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20  er->pFirst );.  
11cb0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
11cc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11cd0 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
11ce0 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
11cf0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
11d00 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
11d10 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
11d20 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
11d30 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
11d40 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
11d50 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
11d60 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
11d70 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
11d80 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
11d90 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
11da0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
11db0 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
11dc0 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
11dd0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
11de0 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
11df0 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
11e00 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
11e10 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
11e20 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
11e30 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
11e40 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
11e50 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
11e60 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
11e70 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
11e80 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
11e90 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
11ea0 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
11eb0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
11ec0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
11ed0 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
11ee0 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
11ef0 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
11f00 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
11f10 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
11f20 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
11f30 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
11f40 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
11f50 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
11f60 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
11f70 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
11f80 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
11f90 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
11fa0 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
11fb0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
11fc0 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
11fd0 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
11fe0 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
11ff0 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
12000 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
12010 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
12020 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
12030 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
12040 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
12050 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
12060 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
12070 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
12080 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
12090 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
120a0 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
120b0 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
120c0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
120d0 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
120e0 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
120f0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
12100 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
12110 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
12120 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
12130 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
12140 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
12150 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
12160 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
12170 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
12180 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
12190 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
121a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
121b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
121c0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c    }..  while( pL
121d0 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
121e0 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
121f0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
12200 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
12210 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
12220 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
12230 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 2f 2a  ageSize);.    /*
12240 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
12250 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
12260 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
12270 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
12280 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
12290 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
122a0 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
122b0 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
122c0 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
122d0 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
122e0 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
122f0 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
12300 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
12310 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
12320 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
12330 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
12340 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
12350 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
12360 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
12370 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
12380 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
12390 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
123a0 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54  gno, 6);.      T
123b0 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20  RACE3("STORE %d 
123c0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
123d0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
123e0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  st->pgno);.     
123f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
12400 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
12410 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
12420 70 4c 69 73 74 29 2c 20 70 50 61 67 65 72 2d 3e  pList), pPager->
12430 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
12440 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50   CODEC(pPager, P
12450 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
12460 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
12470 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
12480 65 72 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  er->nWrite++;.  
12490 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
124a0 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
124b0 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f     TRACE3("NOSTO
124c0 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
124d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
124e0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
124f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
12500 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
12510 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
12520 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
12530 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
12540 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
12550 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
12560 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
12570 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
12580 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
12590 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
125a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
125b0 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
125c0 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
125d0 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
125e0 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
125f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
12600 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
12610 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
12620 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
12630 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
12640 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
12650 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
12660 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
12670 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
12680 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
12690 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
126a0 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
126b0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
126c0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
126d0 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
126e0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
126f0 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
12700 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
12710 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12720 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
12730 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
12740 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
12750 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
12760 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
12770 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
12780 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
12790 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
127a0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
127b0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
127c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
127d0 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
127e0 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
127f0 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
12800 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
12810 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
12820 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
12830 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
12840 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
12850 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
12860 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  urnal..*/.static
12870 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
12880 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
12890 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  ){.  if( !pPager
128a0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72  ->useJournal ) r
128b0 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
128c0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
128d0 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  sts(pPager->zJou
128e0 72 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30  rnal) ) return 0
128f0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f  ;.  if( sqlite3O
12900 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  sCheckReservedLo
12910 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20  ck(&pPager->fd) 
12920 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
12930 28 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  ( sqlite3pager_p
12940 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
12950 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
12960 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
12970 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
12980 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
12990 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
129a0 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  1;.  }.}../*.** 
129b0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
129c0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
129d0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
129e0 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
129f0 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
12a00 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
12a10 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
12a20 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
12a30 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
12a40 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
12a50 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73  .** A _get works
12a60 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
12a70 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
12a80 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
12a90 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
12aa0 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
12ab0 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
12ac0 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
12ad0 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
12ae0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
12af0 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
12b00 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
12b10 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
12b20 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
12b30 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
12b40 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
12b50 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
12b60 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
12b70 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
12b80 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
12b90 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
12ba0 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
12bb0 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
12bc0 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
12bd0 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
12be0 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
12bf0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
12c00 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
12c10 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
12c20 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
12c30 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
12c40 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68  okup().  Both th
12c50 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f  is routine and _
12c60 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  lookup() attempt
12c70 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
12c80 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
12c90 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
12ca0 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
12cb0 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
12cc0 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
12cd0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
12ce0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
12cf0 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b  in whereas _look
12d00 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74  up().** just ret
12d10 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f  urns 0.  This ro
12d20 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61  utine acquires a
12d30 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66   read-lock the f
12d40 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20  irst time it.** 
12d50 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73  has to go to dis
12d60 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73  k, and could als
12d70 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c  o playback an ol
12d80 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63  d journal if nec
12d90 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65  essary..** Since
12da0 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72   _lookup() never
12db0 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69   goes to disk, i
12dc0 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64  t never has to d
12dd0 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a  eal with locks.*
12de0 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  * or journal fil
12df0 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
12e00 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65  e3pager_get(Page
12e10 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
12e20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50  pgno, void **ppP
12e30 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  age){.  PgHdr *p
12e40 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
12e50 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20   /* The maximum 
12e60 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32  page number is 2
12e70 5e 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  ^31. Return SQLI
12e80 54 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20  TE_CORRUPT if a 
12e90 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  page.  ** number
12ea0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
12eb0 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20  is, or zero, is 
12ec0 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
12ed0 20 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52    if( pgno>PAGER
12ee0 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e  _MAX_PGNO || pgn
12ef0 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  o==0 ){.    retu
12f00 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12f10 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
12f20 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
12f30 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
12f40 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
12f50 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
12f60 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
12f70 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
12f80 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
12f90 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
12fa0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
12fb0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
12fc0 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ager);.  }..  /*
12fd0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
12fe0 66 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73  first page acces
12ff0 73 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20  sed, then get a 
13000 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
13010 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
13020 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
13030 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  ( pPager->nRef==
13040 30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20  0 && !MEMDB ){. 
13050 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
13060 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20  noReadlock ){.  
13070 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
13080 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
13090 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29  er, SHARED_LOCK)
130a0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
130b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
130c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
130d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
130e0 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
130f0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
13100 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
13110 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
13120 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
13130 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
13140 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
13150 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
13160 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
13170 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73    */.    if( has
13180 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
13190 72 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74  r) ){.       int
131a0 20 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20   rc;..       /* 
131b0 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  Get an EXCLUSIVE
131c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
131d0 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74  abase file. At t
131e0 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a  his point it is.
131f0 20 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74         ** import
13200 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
13210 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
13220 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
13230 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
13240 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
13250 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
13260 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
13270 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
13280 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
13290 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20  se file, detect 
132a0 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63  the RESERVED loc
132b0 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20  k, and conclude 
132c0 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20  that the.       
132d0 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73  ** database is s
132e0 61 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c  afe to read whil
132f0 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69  e this process i
13300 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20  s still rolling 
13310 69 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61  it .       ** ba
13320 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20  ck..       ** . 
13330 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65        ** Because
13340 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74   the intermediat
13350 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  e RESERVED lock 
13360 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64  is not requested
13370 2c 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20  , the.       ** 
13380 73 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77  second process w
13390 69 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20  ill get to this 
133a0 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
133b0 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20  e and fail to.  
133c0 20 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69       ** obtain i
133d0 74 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56  t's own EXCLUSIV
133e0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
133f0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
13400 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63      */.       rc
13410 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
13420 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58  (&pPager->fd, EX
13430 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
13440 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13460 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
13470 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
13480 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
13490 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
134a0 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
134b0 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
134c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20  n rc;.       }. 
134d0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
134e0 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
134f0 55 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f  USIVE;..       /
13500 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e  * Open the journ
13510 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  al for reading o
13520 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  nly.  Return SQL
13530 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20  ITE_BUSY if.    
13540 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61     ** we are una
13550 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20  ble to open the 
13560 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20  journal file. . 
13570 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
13580 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
13590 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
135a0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
135b0 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
135c0 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69     ** journal fi
135d0 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e  le is never open
135e0 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e   unless the main
135f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
13600 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61  olds.       ** a
13610 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20   write lock, so 
13620 74 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61  there is never a
13630 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f  ny chance of two
13640 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20   or more.       
13650 2a 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65  ** processes ope
13660 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ning the journal
13670 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
13680 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  e..       */.   
13690 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
136a0 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70  OsOpenReadOnly(p
136b0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
136c0 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a   &pPager->jfd);.
136d0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
136e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
136f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e       sqlite3OsUn
13700 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
13710 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
13720 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
13730 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
13740 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  K;.         retu
13750 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
13760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13770 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13780 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  pen = 1;.       
13790 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
137a0 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
137b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
137c0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
137d0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
137e0 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ter = 0;.       
137f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
13800 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  dr = 0;..       
13810 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20  /* Playback and 
13820 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
13830 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61  al.  Drop the da
13840 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20  tabase write.   
13850 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20      ** lock and 
13860 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65  reacquire the re
13870 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20  ad lock..       
13880 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70  */.       rc = p
13890 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
138a0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66  ager);.       if
138b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
138c0 29 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75  ){.         retu
138d0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a  rn rc;.       }.
138e0 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20      }.    pPg = 
138f0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
13900 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61  /* Search for pa
13910 67 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20  ge in cache */. 
13920 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c     pPg = pager_l
13930 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
13940 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  no);.    if( MEM
13950 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74  DB && pPager->st
13960 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
13970 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
13980 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
13990 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20  _SHARED;.    }. 
139a0 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20   }.  if( pPg==0 
139b0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  ){.    /* The re
139c0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
139d0 6e 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20  not in the page 
139e0 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e  cache. */.    in
139f0 74 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  t h;.    pPager-
13a00 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66  >nMiss++;.    if
13a10 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c  ( pPager->nPage<
13a20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c  pPager->mxPage |
13a30 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  | pPager->pFirst
13a40 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a  ==0 || MEMDB ){.
13a50 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20        /* Create 
13a60 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20  a new page */.  
13a70 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
13a80 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
13a90 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
13aa0 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
13ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ac0 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
13ad0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
13ae0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13b00 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
13b10 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
13b20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
13b30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
13b40 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
13b50 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b  = PAGER_ERR_MEM;
13b60 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13b70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13b80 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
13b90 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
13ba0 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
13bb0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
13bc0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
13bd0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
13be0 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
13bf0 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
13c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
13c10 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
13c20 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
13c30 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
13c40 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
13c50 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
13c60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
13c70 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
13c80 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
13c90 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
13ca0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13cb0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
13cc0 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
13cd0 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
13ce0 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
13cf0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  age++;.      }. 
13d00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13d10 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
13d20 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
13d30 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
13d40 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
13d50 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20       ** require 
13d60 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
13d70 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
13d80 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
13d90 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
13da0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
13db0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
13dc0 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
13dd0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
13de0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
13df0 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f  ync().      ** o
13e00 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
13e10 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
13e20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
13e30 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20   This is a.     
13e40 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
13e50 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
13e60 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
13e70 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
13e80 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74  imes.      ** it
13e90 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
13ea0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13eb0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
13ec0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
13ed0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
13ee0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
13ef0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
13f00 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
13f10 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
13f20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
13f30 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13f50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
13f60 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
13f70 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
13f80 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
13f90 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
13fa0 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
13fb0 68 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he..  ** journal
13fc0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
13fd0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
13fe0 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
13ff0 75 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64  urnal..  ** head
14000 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c  er that is invol
14010 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ved in the rollb
14020 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61  ack of pages tha
14030 74 20 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72  t have..  ** alr
14040 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
14050 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
14060 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
14070 65 61 64 65 72 20 69 73 0a 09 20 20 2a 2a 20 74  eader is..  ** t
14080 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  rashed when the 
14090 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
140a0 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20  dated)..        
140b0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
140c0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
140d0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
140e0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
140f0 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20  alOff > 0 );.   
14100 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
14110 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
14120 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
14130 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
14140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
14150 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
14160 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
14170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14180 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
14190 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
141a0 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
141b0 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20  er->pFirst;.    
141c0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
141d0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
141e0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
141f0 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
14200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14210 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
14220 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14230 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
14240 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14250 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
14260 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  0 );.        pPg
14270 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
14280 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14290 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
142a0 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20   pPg );.        
142b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
142c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
142d0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
142e0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
142f0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14300 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
14310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14320 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
14330 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
14340 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
14350 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
14360 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
14370 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
14380 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
14390 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61  set the global a
143a0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
143b0 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69  ag, thus disabli
143c0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ng the.      ** 
143d0 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c  sqlite_dont_roll
143e0 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
143f0 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
14400 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
14410 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tion..      ** I
14420 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
14430 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
14440 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
14450 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
14460 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  .      ** might 
14470 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
14480 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
14490 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
144a0 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
144b0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
144c0 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
144d0 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
144e0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
144f0 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20   pages must.    
14500 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
14510 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
14520 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
14530 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
14540 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
14550 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
14560 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77       pPager->alw
14570 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
14580 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14590 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
145a0 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
145b0 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
145c0 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20  e hash table.   
145d0 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69     */.      unli
145e0 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
145f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c     pPager->nOvfl
14600 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ++;.    }.    pP
14610 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
14620 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14630 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
14640 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
14650 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
14660 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
14670 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  kMemory(pPager->
14680 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  aInJournal, pgno
14690 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  /8);.      asser
146a0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
146b0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
146c0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
146d0 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   (pPager->aInJou
146e0 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  rnal[pgno/8] & (
146f0 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
14700 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
14710 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
14720 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
14730 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
14740 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
14750 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
14760 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
14770 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  InStmt && (int)p
14780 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
14790 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  tSize.          
147a0 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61     && (pPager->a
147b0 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26  InStmt[pgno/8] &
147c0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
147d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
147e0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
147f0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  t(pPg);.    }els
14800 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65  e{.      page_re
14810 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
14820 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
14830 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
14840 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65   0;.    pPg->nRe
14850 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e  f = 1;.    REFIN
14860 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61  FO(pPg);.    pPa
14870 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
14880 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
14890 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pgno);.    pPg->
148a0 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
148b0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
148c0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
148d0 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  h] = pPg;.    if
148e0 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
148f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
14900 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
14910 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
14920 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
14930 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
14940 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
14950 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
14960 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
14970 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
14980 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
14990 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
149a0 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
149b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
149c0 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
149d0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
149e0 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
149f0 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
14a00 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
14a10 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
14a20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14a30 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
14a40 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
14a50 6e 74 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29  nt(pPager)<(int)
14a60 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65  pgno ){.      me
14a70 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
14a80 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
14a90 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14aa0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14ab0 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73  int rc;.      as
14ac0 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
14ad0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
14ae0 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
14af0 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
14b00 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
14b10 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e);.      rc = s
14b20 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
14b30 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
14b40 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
14b50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14b60 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46  .      TRACE3("F
14b70 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
14b80 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
14b90 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
14ba0 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
14bb0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
14bc0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
14bd0 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66  no, 3);.      if
14be0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14bf0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 66  ){.        i64 f
14c00 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ileSize;.       
14c10 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
14c20 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
14c30 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53  fd,&fileSize)!=S
14c40 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
14c50 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53          || fileS
14c60 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72  ize>=pgno*pPager
14c70 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
14c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
14c90 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
14ca0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
14cb0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14cc0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   rc;.        }el
14cd0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
14ce0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
14cf0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
14d00 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14d10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14d20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
14d30 61 67 65 72 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20  ager->nRead++;. 
14d40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
14d50 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
14d60 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
14d70 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
14d80 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
14d90 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
14da0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
14db0 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
14dc0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
14dd0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
14de0 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f  Hit++;.    page_
14df0 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
14e00 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
14e10 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
14e20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14e30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
14e40 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
14e50 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
14e60 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
14e70 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
14e80 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
14e90 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
14ea0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14eb0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
14ec0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
14ed0 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
14ee0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
14ef0 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  3pager_get().  T
14f00 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
14f10 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
14f20 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
14f30 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  3pager_get() is 
14f40 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
14f50 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
14f60 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
14f70 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
14f80 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
14f90 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
14fa0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
14fb0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
14fc0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
14fd0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
14fe0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
14ff0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
15000 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
15010 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
15020 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
15030 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
15040 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
15050 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
15060 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
15070 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
15080 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
15090 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
150a0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
150b0 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
150c0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
150d0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
150e0 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
150f0 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
15100 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
15110 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
15120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
15130 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
15140 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
15150 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
15160 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
15170 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
15180 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
15190 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
151a0 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
151b0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
151c0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
151d0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
151e0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
151f0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15200 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
15210 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15220 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  3pager_unref(voi
15230 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
15240 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
15250 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
15260 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
15270 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
15280 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
15290 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
152a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
152b0 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
152c0 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
152d0 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
152e0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
152f0 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
15300 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
15310 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
15320 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
15330 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
15340 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
15350 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
15360 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
15370 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
15380 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
15390 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
153a0 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
153b0 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
153c0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
153d0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
153e0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
153f0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
15400 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
15410 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
15420 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
15430 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
15440 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
15450 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
15460 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15470 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
15480 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
15490 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
154a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
154b0 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
154c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
154d0 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
154e0 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
154f0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
15500 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
15510 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
15520 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
15530 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
15540 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
15550 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
15560 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
15570 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
15580 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
15590 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
155a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
155b0 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
155c0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
155d0 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
155e0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
155f0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
15600 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15610 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
15620 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
15630 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
15640 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
15650 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
15660 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
15670 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
15680 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
15690 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
156a0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
156b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
156c0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
156d0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
156e0 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
156f0 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
15700 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
15710 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
15720 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15730 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
15740 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15750 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
15760 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
15770 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
15780 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
15790 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
157a0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
157b0 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
157c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
157d0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
157e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
157f0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
15800 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
15810 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
15820 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
15830 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61  urnal = sqliteMa
15840 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
15850 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
15860 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  if( pPager->aInJ
15870 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20  ournal==0 ){.   
15880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
15890 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69  EM;.    goto fai
158a0 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
158b0 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nal;.  }.  rc = 
158c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
158d0 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e 7a  lusive(pPager->z
158e0 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
158f0 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74 65  ->jfd,pPager->te
15900 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67 65  mpFile);.  pPage
15910 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
15920 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
15930 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
15940 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
15950 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
15960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15970 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f   goto failed_to_
15980 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20  open_journal;.  
15990 7d 0a 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43  }.  SET_FULLSYNC
159a0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
159b0 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b  ager->fullSync);
159c0 0a 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28  .  SET_FULLSYNC(
159d0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
159e0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  er->fullSync);. 
159f0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69   sqlite3OsOpenDi
15a00 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e  rectory(pPager->
15a10 7a 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61  zDirectory, &pPa
15a20 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61  ger->jfd);.  pPa
15a30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
15a40 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 1;.  pPager->
15a50 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
15a60 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65   0;.  pPager->ne
15a70 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
15a80 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
15a90 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67  back = 0;.  pPag
15aa0 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
15ab0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
15ac0 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
15ad0 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
15ae0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 67 6f  (pPager);.    go
15af0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
15b00 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
15b10 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
15b20 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
15b30 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72  Size;..  rc = wr
15b40 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
15b50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50  ager);..  if( pP
15b60 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
15b70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  en && rc==SQLITE
15b80 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15b90 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
15ba0 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29 3b  t_begin(pPager);
15bb0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
15bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15bd0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
15be0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
15bf0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15c00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15c10 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
15c20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
15c30 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f  urn rc;..failed_
15c40 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a  to_open_journal:
15c50 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
15c60 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
15c70 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
15c80 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 73  Journal = 0;.  s
15c90 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26  qlite3OsUnlock(&
15ca0 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c  pPager->fd, NO_L
15cb0 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  OCK);.  pPager->
15cc0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
15cd0 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 72  LOCK;.  return r
15ce0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  c;.}../*.** Acqu
15cf0 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ire a write-lock
15d00 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15d10 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72  .  The lock is r
15d20 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74  emoved when.** t
15d30 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  he any of the fo
15d40 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a  llowing happen:.
15d50 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  **.**   *  sqlit
15d60 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29  e3pager_commit()
15d70 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
15d80 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72   *  sqlite3pager
15d90 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20 63  _rollback() is c
15da0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
15db0 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
15dc0 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
15dd0 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
15de0 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20 63  ger_unref() is c
15df0 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65 72  alled to on ever
15e00 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
15e10 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
15e20 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74 6f  rst parameter to
15e30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
15e40 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
15e50 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20 74  y open page of t
15e60 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
15e70 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63 68  ile.  Nothing ch
15e80 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65 20  anges about the 
15e90 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73 65  page - it is use
15ea0 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20 61  d merely to.** a
15eb0 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65 72  cquire a pointer
15ec0 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73 74   to the Pager st
15ed0 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20 70  ructure and as p
15ee0 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65 20  roof that there 
15ef0 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61 20  is.** already a 
15f00 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  read-lock on the
15f10 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
15f20 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72 61   The second para
15f30 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20  meter indicates 
15f40 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20 69  how much space i
15f50 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65 72  n bytes to reser
15f60 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73 74  ve for a.** mast
15f70 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d  er journal file-
15f80 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61 72  name at the star
15f90 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
15fa0 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65 61   when it is crea
15fb0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75  ted..**.** A jou
15fc0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
15fd0 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20 6e  ned if this is n
15fe0 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  ot a temporary f
15ff0 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f 72  ile.  For tempor
16000 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74 68  ary.** files, th
16010 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68 65  e opening of the
16020 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
16030 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20   deferred until 
16040 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20 61  there is an.** a
16050 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77 72  ctual need to wr
16060 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
16070 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  al..**.** If the
16080 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c 72   database is alr
16090 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66 6f  eady reserved fo
160a0 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73 20  r writing, this 
160b0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
160c0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78 46  op..**.** If exF
160d0 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f 20  lag is true, go 
160e0 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61 6e  ahead and get an
160f0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16100 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  on the file.** i
16110 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74 65  mmediately inste
16120 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75 6e  ad of waiting un
16130 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66 6c  til we try to fl
16140 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20 20  ush the cache.  
16150 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69 73  The.** exFlag is
16160 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74 72   ignored if a tr
16170 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
16180 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  eady active..*/.
16190 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
161a0 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44 61  _begin(void *pDa
161b0 74 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29 7b  ta, int exFlag){
161c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
161d0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
161e0 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70  ata);.  Pager *p
161f0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
16200 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
16210 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73  SQLITE_OK;.  ass
16220 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
16230 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
16240 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
16250 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69  ER_UNLOCK );.  i
16260 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
16270 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  ==PAGER_SHARED )
16280 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
16290 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
162a0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 4d  ==0 );.    if( M
162b0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
162c0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
162d0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
162e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
162f0 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  gDbSize = pPager
16300 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d 65  ->dbSize;.    }e
16310 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
16320 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
16330 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
16340 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
16350 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
16360 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
16370 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
16380 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20 20  GER_RESERVED;.  
16390 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61 67        if( exFlag
163a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
163b0 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
163c0 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
163d0 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20  CLUSIVE_LOCK);. 
163e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
163f0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16410 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61       }.      pPa
16430 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
16440 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43 45  = 0;.      TRACE
16450 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25  2("TRANSACTION %
16460 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
16470 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69 66  ager));.      if
16480 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
16490 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72 2d  rnal && !pPager-
164a0 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
164b0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
164c0 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61  open_journal(pPa
164d0 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ger);.      }.  
164e0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
164f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
16500 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
16510 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
16520 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
16530 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
16540 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
16550 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
16560 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
16570 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
16580 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
16590 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
165a0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
165b0 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
165c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
165d0 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
165e0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
165f0 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
16600 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
16610 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
16620 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
16630 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
16640 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
16650 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
16660 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
16670 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
16680 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
16690 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
166a0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
166b0 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
166c0 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
166d0 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
166e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
166f0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
16700 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
16710 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
16720 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
16730 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
16740 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
16750 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
16760 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
16770 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
16780 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
16790 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
167a0 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
167b0 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
167c0 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
167d0 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
167e0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70  call to sqlite3p
167f0 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f 72  ager_commit() or
16800 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
16810 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72  llback() to.** r
16820 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eset..*/.int sql
16830 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
16840 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
16850 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
16860 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
16870 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
16880 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
16890 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
168a0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
168b0 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
168c0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
168d0 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20 20  ->errMask ){ .  
168e0 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
168f0 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
16900 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
16910 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
16920 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16930 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
16940 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
16950 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
16960 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
16970 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
16980 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
16990 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
169a0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
169b0 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
169c0 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
169d0 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
169e0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  away..  */.  pPg
169f0 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 69  ->dirty = 1;.  i
16a00 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  f( pPg->inJourna
16a10 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74 6d  l && (pPg->inStm
16a20 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d  t || pPager->stm
16a30 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20  tInUse==0) ){.  
16a40 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
16a50 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ache = 1;.  }els
16a60 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  e{..    /* If we
16a70 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20 69   get this far, i
16a80 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
16a90 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62   page needs to b
16aa0 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e  e.    ** written
16ab0 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74   to the transact
16ac0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ion journal or t
16ad0 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f  he ckeckpoint jo
16ae0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20  urnal.    ** or 
16af0 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  both..    **.   
16b00 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   ** First check 
16b10 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65 20  to see that the 
16b20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
16b30 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20  nal exists and. 
16b40 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20     ** create it 
16b50 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a  if it does not..
16b60 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
16b70 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
16b80 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
16b90 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
16ba0 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70 44  e3pager_begin(pD
16bb0 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ata, 0);.    if(
16bc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16bd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
16be0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
16bf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
16c00 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
16c10 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70  ED );.    if( !p
16c20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
16c30 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73  en && pPager->us
16c40 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  eJournal ){.    
16c50 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65    rc = pager_ope
16c60 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  n_journal(pPager
16c70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
16c80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
16c90 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16ca0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16cb0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c  ->journalOpen ||
16cc0 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
16cd0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
16ce0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
16cf0 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
16d00 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
16d10 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
16d20 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
16d30 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
16d40 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
16d50 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
16d60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
16d70 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
16d80 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
16d90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
16da0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
16db0 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
16dc0 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
16dd0 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
16de0 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d 3e  nal && (pPager->
16df0 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45  useJournal || ME
16e00 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69 66  MDB) ){.      if
16e10 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  ( (int)pPg->pgno
16e20 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
16e30 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
16e40 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20 20    int szPg;.    
16e50 20 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a 20      u32 saved;. 
16e60 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
16e70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
16e80 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
16e90 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
16ea0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
16eb0 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4a         TRACE3("J
16ec0 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
16ed0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
16ee0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
16ef0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
16f00 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72 69  ert( pHist->pOri
16f10 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  g==0 );.        
16f20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d    pHist->pOrig =
16f30 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
16f40 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
16f50 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ze );.          
16f60 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
16f70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16f80 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
16f90 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
16fa0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
16fb0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
16fc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
16fe0 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
16ff0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
17000 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
17010 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
17020 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65      cksum = page
17030 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
17040 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61 74 61  pPg->pgno, pData
17050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 61 76  );.          sav
17060 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47 48 44  ed = *(u32*)PGHD
17070 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
17080 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17090 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63     store32bits(c
170a0 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61 67 65  ksum, pPg, pPage
170b0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
170c0 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d 20 70          szPg = p
170d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
170e0 38 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  8;.          sto
170f0 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
17100 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
17110 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17120 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
17130 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63 68 61  ger->jfd, &((cha
17140 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c 20 73  r*)pData)[-4], s
17150 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zPg);.          
17160 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17170 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
17180 20 20 20 20 20 20 54 52 41 43 45 34 28 22 4a 4f        TRACE4("JO
17190 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
171a0 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c   needSync=%d\n",
171b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
171c0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
171d0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
171e0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
171f0 20 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70           CODEC(p
17200 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
17210 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
17220 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29 50 47         *(u32*)PG
17230 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
17240 2c 20 70 50 61 67 65 72 29 20 3d 20 73 61 76 65  , pPager) = save
17250 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  d;.          if(
17260 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
17280 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
17290 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
172a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
172b0 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
172c0 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
172d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
172e0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  c;.          }. 
172f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
17300 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
17310 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
17320 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
17330 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
17340 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
17350 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
17360 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
17370 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  );.          pPg
17380 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
17390 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
173a0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
173b0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
173c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
173d0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
173e0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
173f0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
17400 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 5f             page_
17410 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
17420 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
17430 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
17440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17450 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
17460 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
17470 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
17480 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
17490 20 20 20 20 20 20 54 52 41 43 45 34 28 22 41 50        TRACE4("AP
174a0 50 45 4e 44 20 25 64 20 70 61 67 65 20 25 64 20  PEND %d page %d 
174b0 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a  needSync=%d\n",.
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174d0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
174e0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
174f0 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20  >needSync);.    
17500 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 50    }.      if( pP
17510 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  g->needSync ){. 
17520 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
17530 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
17540 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
17550 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
17560 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
17570 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
17580 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
17590 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
175a0 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a  not in it,.    *
175b0 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68 65  * then write the
175c0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
175d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
175e0 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68  ournal.  Note th
175f0 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74  at.    ** the st
17600 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
17610 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73 20 66  format differs f
17620 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64  rom the standard
17630 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a   journal format.
17640 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69      ** in that i
17650 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63  t omits the chec
17660 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65  ksums and the he
17670 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ader..    */.   
17680 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
17690 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
176a0 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  inStmt && (int)p
176b0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
176c0 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20  ->stmtSize ){.  
176d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
176e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69  >inJournal || (i
176f0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61  nt)pPg->pgno>pPa
17700 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
17710 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
17720 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  DB ){.        Pg
17730 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
17740 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
17750 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
17760 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
17770 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a  st->pStmt==0 );.
17780 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
17790 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
177a0 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e  locRaw( pPager->
177b0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
177c0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
177d0 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
177e0 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
177f0 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f  pStmt, PGHDR_TO_
17800 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
17810 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17830 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
17840 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
17850 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
17860 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
17870 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
17880 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74        store32bit
17890 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67  s(pPg->pgno, pPg
178a0 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 43  , -4);.        C
178b0 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61  ODEC(pPager, pDa
178c0 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37  ta, pPg->pgno, 7
178d0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
178e0 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
178f0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 28 28 63  pPager->stfd,((c
17900 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c 20 70  har*)pData)-4, p
17910 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
17920 34 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43  4);.        TRAC
17930 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
17940 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
17950 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
17960 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
17970 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
17980 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
17990 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  gno, 0);.       
179a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
179b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
179c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
179d0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
179e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
179f0 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
17a00 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20 20 20  R_ERR_FULL;.    
17a10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
17a20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17a30 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
17a40 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
17a50 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
17a60 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20  InStmt!=0 );.   
17a70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
17a80 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
17a90 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
17aa0 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20  no&7);.      }. 
17ab0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
17ac0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
17ad0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17ae0 20 55 70 64 61 74 65 20 74 68 65 20 64 61 74 61   Update the data
17af0 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20 72 65  base size and re
17b00 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
17b10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
17b20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29  (int)pPg->pgno )
17b30 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
17b40 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Size = pPg->pgno
17b50 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
17b60 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69   && pPager->dbSi
17b70 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ze==PENDING_BYTE
17b80 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
17b90 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  e ){.      pPage
17ba0 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20  r->dbSize++;.   
17bb0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17bc0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
17bd0 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
17be0 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68  page given in th
17bf0 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70  e argument was p
17c00 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64  reviously passed
17c10 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 70 61  .** to sqlite3pa
17c20 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20 49 6e  ger_write().  In
17c30 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65   other words, re
17c40 74 75 72 6e 20 54 52 55 45 20 69 66 20 69 74 20  turn TRUE if it 
17c50 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e  is ok.** to chan
17c60 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ge the content o
17c70 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 69  f the page..*/.i
17c80 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
17c90 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f 69 64  iswriteable(void
17ca0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
17cb0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
17cc0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
17cd0 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72   return pPg->dir
17ce0 74 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ty;.}..#ifndef S
17cf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
17d00 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63 65 20  M./*.** Replace 
17d10 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  the content of a
17d20 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77 69 74   single page wit
17d30 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  h the informatio
17d40 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64 0a 2a  n in the third.*
17d50 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69  * argument..*/.i
17d60 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
17d70 6f 76 65 72 77 72 69 74 65 28 50 61 67 65 72 20  overwrite(Pager 
17d80 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
17d90 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 29  no, void *pData)
17da0 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b  {.  void *pPage;
17db0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
17dc0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
17dd0 67 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  get(pPager, pgno
17de0 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
17df0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17e00 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
17e10 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  e3pager_write(pP
17e20 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
17e30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17e40 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67       memcpy(pPag
17e50 65 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  e, pData, pPager
17e60 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17e70 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
17e80 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29  ger_unref(pPage)
17e90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
17ea0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  c;.}.#endif../*.
17eb0 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
17ec0 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
17ed0 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
17ee0 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  t is not necessa
17ef0 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74  ry to.** write t
17f00 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  he information o
17f10 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20 62 61  n page "pgno" ba
17f20 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
17f30 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
17f40 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
17f50 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
17f60 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  y..**.** The ove
17f70 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
17f80 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
17f90 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
17fa0 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
17fb0 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
17fc0 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54  ge is unused.  T
17fd0 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74  he pager marks t
17fe0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
17ff0 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64   so.** that it d
18000 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74  oes not get writ
18010 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ten to disk..**.
18020 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68  ** Tests show th
18030 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61  at this optimiza
18040 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77  tion, together w
18050 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ith the.** sqlit
18060 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
18070 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d  lback() below, m
18080 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c 65 20  ore than double 
18090 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20  the speed.** of 
180a0 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f 70 65  large INSERT ope
180b0 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75 61 64  rations and quad
180c0 72 75 70 6c 65 20 74 68 65 20 73 70 65 65 64 20  ruple the speed 
180d0 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54 45 73  of large DELETEs
180e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
180f0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
18100 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61 6c 77  led, set the alw
18110 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
18120 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62   to true..** Sub
18130 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
18140 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f   sqlite3pager_do
18150 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
18160 72 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 0a  r the same page.
18170 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61 66 74  ** will thereaft
18180 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e 20 20  er be ignored.  
18190 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
181a0 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70 72 6f  y to avoid a pro
181b0 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20 61 20  blem.** where a 
181c0 70 61 67 65 20 77 69 74 68 20 64 61 74 61 20 69  page with data i
181d0 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
181e0 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 6f  reelist during o
181f0 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20 61 20  ne part of.** a 
18200 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 65 6e  transaction then
18210 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
18220 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
18230 67 20 61 20 6c 61 74 65 72 20 70 61 72 74 0a 2a  g a later part.*
18240 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20 74 72  * of the same tr
18250 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 72 65  ansaction and re
18260 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20 6f 74  used for some ot
18270 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20 57 68  her purpose.  Wh
18280 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69 72 73  en it.** is firs
18290 74 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  t added to the f
182a0 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20 72 6f  reelist, this ro
182b0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
182c0 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c 0a 2a    When reused,.*
182d0 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  * the dont_rollb
182e0 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73  ack() routine is
182f0 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65   called.  But be
18300 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 63  cause the page c
18310 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69 74 69  ontains.** criti
18320 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69  cal data, we sti
18330 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75  ll need to be su
18340 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c 6c 65  re it gets rolle
18350 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 0a  d back in spite.
18360 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74 5f 72  ** of the dont_r
18370 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a  ollback() call..
18380 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
18390 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74 65 28  ager_dont_write(
183a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
183b0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
183c0 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
183d0 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a  MEMDB ) return;.
183e0 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
183f0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
18400 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61  no);.  pPg->alwa
18410 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
18420 20 20 69 66 28 20 70 50 67 20 26 26 20 70 50 67    if( pPg && pPg
18430 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 69  ->dirty ){.    i
18440 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
18450 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  e==(int)pPg->pgn
18460 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72 69  o && pPager->ori
18470 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e  gDbSize<pPager->
18480 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
18490 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65 73  /* If this pages
184a0 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67   is the last pag
184b0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61 6e  e in the file an
184c0 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 67  d the file has g
184d0 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75  rown.      ** du
184e0 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  ring the current
184f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68   transaction, th
18500 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74  en do NOT mark t
18510 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
18520 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e 20  ..      ** When 
18530 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18540 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73 74  e grows, we must
18550 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
18560 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20 20  the last page.  
18570 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69 74      ** gets writ
18580 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ten at least onc
18590 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64 69  e so that the di
185a0 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  sk file will be 
185b0 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20 20  the correct.    
185c0 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f    ** size. If yo
185d0 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  u do not write t
185e0 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68 65  his page and the
185f0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
18600 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  e.      ** on th
18610 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20 62  e disk ends up b
18620 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  eing too small, 
18630 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74 6f  that can lead to
18640 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
18650 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64 75  ** corruption du
18660 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74 72  ring the next tr
18670 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
18680 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   */.    }else{. 
18690 20 20 20 20 20 54 52 41 43 45 33 28 22 44 4f 4e       TRACE3("DON
186a0 54 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20  T_WRITE page %d 
186b0 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20  of %d\n", pgno, 
186c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
186d0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72  ;.      pPg->dir
186e0 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  ty = 0;.#ifdef S
186f0 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
18700 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
18710 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
18720 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
18730 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
18740 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
18750 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
18760 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
18770 61 74 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b  at if a rollback
18780 20 6f 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69   occurs,.** it i
18790 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
187a0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
187b0 61 74 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  ata on the given
187c0 20 70 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20   page.  This.** 
187d0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
187e0 61 67 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61  ager does not ha
187f0 76 65 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  ve to record the
18800 20 67 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74   given page in t
18810 68 65 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a  he.** rollback j
18820 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ournal..*/.void 
18830 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
18840 74 5f 72 6f 6c 6c 62 61 63 6b 28 76 6f 69 64 20  t_rollback(void 
18850 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
18860 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
18870 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
18880 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
18890 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
188a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
188b0 65 21 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e!=PAGER_EXCLUSI
188c0 56 45 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  VE || pPager->jo
188d0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20 72  urnalOpen==0 ) r
188e0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67  eturn;.  if( pPg
188f0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
18900 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77 61   || pPager->alwa
18910 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45  ysRollback || ME
18920 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  MDB ) return;.  
18930 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72  if( !pPg->inJour
18940 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d  nal && (int)pPg-
18950 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
18960 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
18970 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18980 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
18990 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
189a0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e  aInJournal[pPg->
189b0 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70  pgno/8] |= 1<<(p
189c0 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20  Pg->pgno&7);.   
189d0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
189e0 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 70 50 61  = 1;.    if( pPa
189f0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
18a00 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18a10 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
18a20 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
18a30 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
18a40 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
18a50 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
18a60 7d 0a 20 20 20 20 54 52 41 43 45 33 28 22 44 4f  }.    TRACE3("DO
18a70 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
18a80 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
18a90 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
18aa0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20  (pPager));.  }. 
18ab0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
18ac0 74 49 6e 55 73 65 20 26 26 20 21 70 50 67 2d 3e  tInUse && !pPg->
18ad0 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  inStmt && (int)p
18ae0 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
18af0 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a 20 20  ->stmtSize ){.  
18b00 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
18b10 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
18b20 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65  )pPg->pgno>pPage
18b30 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
18b40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
18b50 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20  ger->aInStmt!=0 
18b60 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
18b70 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
18b80 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
18b90 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 61 67  pgno&7);.    pag
18ba0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
18bb0 73 74 28 70 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a  st(pPg);.  }.}..
18bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
18bd0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a  OMIT_MEMORYDB./*
18be0 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69  .** Clear a PgHi
18bf0 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73  story block.*/.s
18c00 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72  tatic void clear
18c10 48 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72  History(PgHistor
18c20 79 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c  y *pHist){.  sql
18c30 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
18c40 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46  Orig);.  sqliteF
18c50 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
18c60 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69  );.  pHist->pOri
18c70 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e  g = 0;.  pHist->
18c80 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c  pStmt = 0;.}.#el
18c90 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65 61 72  se.#define clear
18ca0 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e 64 69  History(x).#endi
18cb0 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  f../*.** Commit 
18cc0 61 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74  all changes to t
18cd0 68 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  he database and 
18ce0 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74  release the writ
18cf0 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  e lock..**.** If
18d00 20 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c   the commit fail
18d10 73 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e  s for any reason
18d20 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74  , a rollback att
18d30 65 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20  empt is made.** 
18d40 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
18d50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  e is returned.  
18d60 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f  If the commit wo
18d70 72 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a  rked, SQLITE_OK.
18d80 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ** is returned..
18d90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
18da0 67 65 72 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72  ger_commit(Pager
18db0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
18dc0 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
18dd0 67 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  g;..  if( pPager
18de0 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50 41 47 45 52  ->errMask==PAGER
18df0 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
18e00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
18e10 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
18e20 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
18e30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18e40 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18e50 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20  FULL;.    }.    
18e60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
18e70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
18e80 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
18e90 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
18ea0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
18eb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
18ec0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
18ed0 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
18ee0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18ef0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
18f00 0a 20 20 54 52 41 43 45 32 28 22 43 4f 4d 4d 49  .  TRACE2("COMMI
18f10 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
18f20 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
18f30 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
18f40 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
18f50 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
18f60 61 67 65 72 29 3b 0a 20 20 20 20 77 68 69 6c 65  ager);.    while
18f70 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 63  ( pPg ){.      c
18f80 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48 44  learHistory(PGHD
18f90 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
18fa0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
18fb0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
18fc0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
18fd0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
18fe0 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
18ff0 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
19000 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
19010 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  tStmt = 0;.     
19020 20 70 50 67 20 3d 20 70 50 67 2d 3e 70 44 69 72   pPg = pPg->pDir
19030 74 79 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ty;.    }.#ifnde
19040 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72  f NDEBUG.    for
19050 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
19060 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
19070 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
19080 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
19090 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
190a0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
190b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
190c0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
190d0 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ack );.      ass
190e0 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72  ert( !pHist->pOr
190f0 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ig );.      asse
19100 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d  rt( !pHist->pStm
19110 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  t );.    }.#endi
19120 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  f.    pPager->pS
19130 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
19140 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
19150 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
19160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19170 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
19180 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d 30  r->dirtyCache==0
19190 20 29 7b 0a 20 20 20 20 2f 2a 20 45 78 69 74 20   ){.    /* Exit 
191a0 65 61 72 6c 79 20 28 77 69 74 68 6f 75 74 20 64  early (without d
191b0 6f 69 6e 67 20 74 68 65 20 74 69 6d 65 2d 63 6f  oing the time-co
191c0 6e 73 75 6d 69 6e 67 20 73 71 6c 69 74 65 33 4f  nsuming sqlite3O
191d0 73 53 79 6e 63 28 29 20 63 61 6c 6c 73 29 0a 20  sSync() calls). 
191e0 20 20 20 2a 2a 20 69 66 20 74 68 65 72 65 20 68     ** if there h
191f0 61 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e  ave been no chan
19200 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
19210 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
19220 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19230 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a  >needSync==0 );.
19240 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
19250 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
19260 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
19270 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20  dbSize = -1;.   
19280 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
19290 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
192a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
192b0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
192c0 61 67 65 72 5f 73 79 6e 63 28 70 50 61 67 65 72  ager_sync(pPager
192d0 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
192e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
192f0 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
19300 61 62 6f 72 74 3b 0a 20 20 7d 0a 20 20 72 63 20  abort;.  }.  rc 
19310 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c  = pager_unwritel
19320 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ock(pPager);.  p
19330 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
19340 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  -1;.  return rc;
19350 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65  ..  /* Jump here
19360 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
19370 73 20 77 72 6f 6e 67 20 64 75 72 69 6e 67 20 74  s wrong during t
19380 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73  he commit proces
19390 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61  s..  */.commit_a
193a0 62 6f 72 74 3a 0a 20 20 73 71 6c 69 74 65 33 70  bort:.  sqlite3p
193b0 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
193c0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
193d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  rc;.}../*.** Rol
193e0 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65  lback all change
193f0 73 2e 20 20 54 68 65 20 64 61 74 61 62 61 73 65  s.  The database
19400 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50   falls back to P
19410 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65  AGER_SHARED mode
19420 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f  ..** All in-memo
19430 72 79 20 63 61 63 68 65 20 70 61 67 65 73 20 72  ry cache pages r
19440 65 76 65 72 74 20 74 6f 20 74 68 65 69 72 20 6f  evert to their o
19450 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63 6f 6e  riginal data con
19460 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f  tents..** The jo
19470 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74 65 64  urnal is deleted
19480 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
19490 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tine cannot fail
194a0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
194b0 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f  er process is no
194c0 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74  t following.** t
194d0 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63 6b 69  he correct locki
194e0 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 28 53 51 4c  ng protocol (SQL
194f0 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 29 20 6f 72  ITE_PROTOCOL) or
19500 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
19510 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
19520 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
19530 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
19540 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
19550 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
19560 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
19570 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
19580 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
19590 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
195a0 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
195b0 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
195c0 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
195d0 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
195e0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
195f0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
19600 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
19610 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19620 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 52 41 43    int rc;.  TRAC
19630 45 32 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c  E2("ROLLBACK %d\
19640 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19650 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
19660 42 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  B ){.    PgHdr *
19670 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50 61  p;.    for(p=pPa
19680 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d  ger->pAll; p; p=
19690 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  p->pNextAll){.  
196a0 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
196b0 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Hist;.      asse
196c0 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52 6f  rt( !p->alwaysRo
196d0 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20  llback );.      
196e0 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29 7b  if( !p->dirty ){
196f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
19700 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29   !((PgHistory *)
19710 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
19720 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69 67   pPager))->pOrig
19730 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
19740 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72 79  rt( !((PgHistory
19750 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   *)PGHDR_TO_HIST
19760 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 53  (p, pPager))->pS
19770 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 63  tmt );.        c
19780 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
19790 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d 20  ..      pHist = 
197a0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c  PGHDR_TO_HIST(p,
197b0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
197c0 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  if( pHist->pOrig
197d0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63   ){.        memc
197e0 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
197f0 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72 69  (p), pHist->pOri
19800 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
19810 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ize);.        TR
19820 41 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50  ACE3("ROLLBACK-P
19830 41 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  AGE %d of %d\n",
19840 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49   p->pgno, PAGERI
19850 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  D(pPager));.    
19860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19870 20 54 52 41 43 45 33 28 22 50 41 47 45 20 25 64   TRACE3("PAGE %d
19880 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c   is clean on %d\
19890 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47  n", p->pgno, PAG
198a0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
198b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65       }.      cle
198c0 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74 29  arHistory(pHist)
198d0 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79  ;.      p->dirty
198e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69   = 0;.      p->i
198f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
19900 20 20 20 20 70 2d 3e 69 6e 53 74 6d 74 20 3d 20      p->inStmt = 
19910 30 3b 0a 20 20 20 20 20 20 70 2d 3e 70 50 72 65  0;.      p->pPre
19920 76 53 74 6d 74 20 3d 20 70 2d 3e 70 4e 65 78 74  vStmt = p->pNext
19930 53 74 6d 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20  Stmt = 0;..     
19940 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
19950 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
19960 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
19970 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
19980 41 28 70 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  A(p), pPager->pa
19990 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
199a0 0a 20 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20  .      .    }.  
199b0 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
199c0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
199d0 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
199e0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
199f0 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
19a00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
19a10 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
19a20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
19a30 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
19a40 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
19a50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
19a60 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ..  if( !pPager-
19a70 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20 21  >dirtyCache || !
19a80 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
19a90 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  pen ){.    rc = 
19aa0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
19ab0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
19ac0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
19ad0 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
19ae0 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
19af0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
19b00 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   && pPager->errM
19b10 61 73 6b 21 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask!=PAGER_ERR_F
19b20 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ULL ){.    if( p
19b30 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
19b40 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
19b50 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61  .      pager_pla
19b60 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
19b70 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
19b80 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
19b90 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
19ba0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
19bb0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
19bc0 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
19bd0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
19be0 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65  load_cache(pPage
19bf0 72 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61  r);.    rc2 = pa
19c00 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
19c10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
19c20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
19c30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
19c40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
19c50 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
19c60 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
19c70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
19c80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19c90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
19ca0 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43  RUPT;  /* bkpt-C
19cb0 4f 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 70 50  ORRUPT */.    pP
19cc0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
19cd0 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
19ce0 50 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  PT;.  }.  pPager
19cf0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
19d00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19d10 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
19d20 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
19d30 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
19d40 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
19d50 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
19d60 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
19d70 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
19d80 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
19d90 74 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f  te3pager_isreado
19da0 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65  nly(Pager *pPage
19db0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
19dc0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d  ger->readOnly;.}
19dd0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
19de0 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
19df0 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61   testing and ana
19e00 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69  lysis only..*/.i
19e10 6e 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  nt *sqlite3pager
19e20 5f 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50  _stats(Pager *pP
19e30 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20  ager){.  static 
19e40 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30  int a[11];.  a[0
19e50 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ] = pPager->nRef
19e60 3b 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65  ;.  a[1] = pPage
19e70 72 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d  r->nPage;.  a[2]
19e80 20 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67   = pPager->mxPag
19e90 65 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67  e;.  a[3] = pPag
19ea0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b  er->dbSize;.  a[
19eb0 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61  4] = pPager->sta
19ec0 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61  te;.  a[5] = pPa
19ed0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20  ger->errMask;.  
19ee0 61 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[6] = pPager->n
19ef0 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50  Hit;.  a[7] = pP
19f00 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61  ager->nMiss;.  a
19f10 5b 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f  [8] = pPager->nO
19f20 76 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50  vfl;.  a[9] = pP
19f30 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61  ager->nRead;.  a
19f40 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  [10] = pPager->n
19f50 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20  Write;.  return 
19f60 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  a;.}../*.** Set 
19f70 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  the statement ro
19f80 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a  llback point..**
19f90 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19fa0 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
19fb0 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73  d with the trans
19fc0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61  action journal a
19fd0 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20  lready.** open. 
19fe0 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   A new statement
19ff0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61   journal is crea
1a000 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20  ted that can be 
1a010 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  used to rollback
1a020 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61  .** changes of a
1a030 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
1a040 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72  and within a lar
1a050 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ger transaction.
1a060 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1a070 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
1a080 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a090 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1a0a0 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
1a0b0 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20  MPNAME_SIZE];.  
1a0c0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1a0d0 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
1a0e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a0f0 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54  dbSize>=0 );.  T
1a100 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
1a110 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
1a120 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1a130 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
1a140 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1a150 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1a160 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
1a170 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1a180 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a190 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
1a1a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a1b0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1a1c0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
1a1d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a1e0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1a1f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1a200 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
1a210 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
1a220 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1a230 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1a240 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
1a250 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
1a260 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
1a270 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
1a280 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
1a290 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a2a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
1a2b0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
1a2c0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1a2d0 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
1a2e0 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74  d, &pPager->stmt
1a2f0 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
1a300 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1a310 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
1a320 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
1a330 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72  tJSize == pPager
1a340 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
1a350 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
1a360 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
1a370 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1a380 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
1a390 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1a3a0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
1a3b0 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
1a3c0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
1a3d0 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
1a3e0 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
1a3f0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1a400 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a410 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
1a420 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65  mp(zTemp, &pPage
1a430 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
1a440 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
1a450 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
1a460 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
1a470 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
1a480 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1a490 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1a4a0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1a4b0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a4c0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
1a4d0 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
1a4e0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1a4f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1a500 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
1a510 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1a520 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
1a530 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a540 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
1a550 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1a560 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1a570 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  mt_commit(Pager 
1a580 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a590 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1a5a0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1a5b0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
1a5c0 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f   TRACE2("STMT-CO
1a5d0 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1a5e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1a5f0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
1a600 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
1a610 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66  eek(&pPager->stf
1a620 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  d, 0);.      /* 
1a630 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
1a640 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  e(&pPager->stfd,
1a650 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
1a660 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
1a670 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
1a680 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1a690 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
1a6a0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1a6b0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1a6c0 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
1a6d0 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
1a6e0 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
1a6f0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
1a700 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
1a710 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1a720 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
1a730 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1a740 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1a750 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1a760 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1a770 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1a780 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1a790 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
1a7a0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1a7b0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1a7c0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1a7d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1a7e0 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1a7f0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1a800 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1a810 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1a820 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
1a830 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1a840 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1a850 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1a860 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
1a870 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1a880 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1a890 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
1a8a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1a8b0 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
1a8c0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1a8d0 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
1a8e0 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
1a8f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1a900 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
1a910 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
1a920 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
1a930 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1a940 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
1a950 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
1a960 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1a970 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1a980 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1a990 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
1a9a0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
1a9b0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1a9c0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
1a9d0 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
1a9e0 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
1a9f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1aa00 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1aa10 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
1aa20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1aa30 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1aa40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1aa50 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1aa60 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1aa70 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
1aa80 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
1aa90 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1aaa0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1aab0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1aac0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
1aad0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1aae0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1aaf0 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
1ab00 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1ab10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ab20 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1ab30 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1ab40 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ab50 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ab60 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1ab70 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ab80 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1ab90 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1aba0 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
1abb0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1abc0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
1abd0 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
1abe0 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
1abf0 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
1ac00 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1ac10 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1ac20 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
1ac30 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ac40 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1ac50 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
1ac60 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ac70 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1ac80 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1ac90 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1aca0 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1acb0 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  journalname(Page
1acc0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1acd0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
1ace0 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
1acf0 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f  Set the codec fo
1ad00 72 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a  r this pager.*/.
1ad10 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1ad20 72 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50  r_set_codec(.  P
1ad30 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
1ad40 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76  void (*xCodec)(v
1ad50 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
1ad60 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43  int),.  void *pC
1ad70 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61  odecArg.){.  pPa
1ad80 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43  ger->xCodec = xC
1ad90 6f 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e  odec;.  pPager->
1ada0 70 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64  pCodecArg = pCod
1adb0 65 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ecArg;.}../*.** 
1adc0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
1add0 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
1ade0 65 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65  ent the database
1adf0 20 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75   file change-cou
1ae00 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20  nter,.** stored 
1ae10 61 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68  at byte 24 of th
1ae20 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f  e pager file..*/
1ae30 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1ae40 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1ae50 6e 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  nter(Pager *pPag
1ae60 65 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61  er){.  void *pPa
1ae70 67 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  ge;.  PgHdr *pPg
1ae80 48 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67  Hdr;.  u32 chang
1ae90 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74  e_counter;.  int
1aea0 20 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20   rc;..  /* Open 
1aeb0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69  page 1 of the fi
1aec0 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20  le for writing. 
1aed0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1aee0 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1aef0 72 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20  r, 1, &pPage);. 
1af00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1af10 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1af20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1af30 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1af40 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1af50 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1af60 63 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68  c;..  /* Read th
1af70 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  e current value 
1af80 61 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  at byte 24. */. 
1af90 20 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54   pPgHdr = DATA_T
1afa0 4f 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a  O_PGHDR(pPage);.
1afb0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
1afc0 20 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74   = retrieve32bit
1afd0 73 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a  s(pPgHdr, 24);..
1afe0 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1aff0 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
1b000 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
1b010 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
1b020 20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75   */.  change_cou
1b030 6e 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33  nter++;.  store3
1b040 32 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75  2bits(change_cou
1b050 6e 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34  nter, pPgHdr, 24
1b060 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65  );..  /* Release
1b070 20 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65   the page refere
1b080 6e 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nce. */.  sqlite
1b090 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
1b0a0 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ge);.  return SQ
1b0b0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b0c0 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
1b0d0 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65  ase file for the
1b0e0 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a   pager pPager. z
1b0f0 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
1b100 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20   the name.** of 
1b110 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
1b120 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
1b130 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
1b140 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  o the individual
1b150 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1b160 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65  . zMaster may be
1b170 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20   NULL, which is 
1b180 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e  interpreted as n
1b190 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72  o master.** jour
1b1a0 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61  nal (a single da
1b1b0 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69  tabase transacti
1b1c0 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  on)..**.** This 
1b1d0 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20  routine ensures 
1b1e0 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
1b1f0 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20   is synced, all 
1b200 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74  dirty pages writ
1b210 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61  ten.** to the da
1b220 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
1b230 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b240 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e  e synced. The on
1b250 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a  ly thing that.**
1b260 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d   remains to comm
1b270 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
1b280 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20  on is to delete 
1b290 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b2a0 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a   (or.** master j
1b2b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73  ournal file if s
1b2c0 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a  pecified)..**.**
1b2d0 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d   Note that if zM
1b2e0 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69  aster==NULL, thi
1b2f0 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77  s does not overw
1b300 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20  rite a previous 
1b310 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20  value.** passed 
1b320 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67  to an sqlite3pag
1b330 65 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a  er_sync() call..
1b340 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
1b350 65 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e  er nTrunc is non
1b360 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
1b370 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72  pager file is tr
1b380 75 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54  uncated to.** nT
1b390 72 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73  runc pages (this
1b3a0 20 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f   is used by auto
1b3b0 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
1b3c0 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
1b3d0 65 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67  e3pager_sync(Pag
1b3e0 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
1b3f0 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c  t char *zMaster,
1b400 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20   Pgno nTrunc){. 
1b410 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b420 5f 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22  _OK;..  TRACE4("
1b430 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46  DATABASE SYNC: F
1b440 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25  ile=%s zMaster=%
1b450 73 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20  s nTrunc=%d\n", 
1b460 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
1b470 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
1b480 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f  r, nTrunc);..  /
1b490 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
1b4a0 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72  in-memory db, or
1b4b0 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62   no pages have b
1b4c0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20  een written to, 
1b4d0 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  or this.  ** fun
1b4e0 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
1b4f0 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69  y been called, i
1b500 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  t is a no-op..  
1b510 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
1b520 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
1b530 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26  NCED && !MEMDB &
1b540 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  & pPager->dirtyC
1b550 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64  ache ){.    PgHd
1b560 72 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65  r *pPg;.    asse
1b570 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1b580 6e 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20  nalOpen );..    
1b590 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
1b5a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
1b5b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1b5c0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
1b5d0 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
1b5e0 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
1b5f0 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
1b600 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
1b610 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
1b620 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
1b630 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
1b640 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
1b650 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
1b660 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
1b670 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
1b680 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
1b690 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
1b6a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
1b6b0 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
1b6c0 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
1b6d0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
1b6e0 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
1b6f0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
1b700 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
1b710 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f  rc = pager_incr_
1b720 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50  changecounter(pP
1b730 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
1b740 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b750 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1b760 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1b770 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1b780 20 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63        if( nTrunc
1b790 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  !=0 ){.        /
1b7a0 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
1b7b0 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
1b7c0 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
1b7d0 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
1b7e0 67 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62  ges.        ** b
1b7f0 65 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62  eing discarded b
1b800 79 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e  y the truncation
1b810 20 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e   must be written
1b820 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
1b830 20 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e          ** file.
1b840 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1b850 20 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20      Pgno i;.    
1b860 20 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b      void *pPage;
1b870 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d  .        for( i=
1b880 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61  nTrunc+1; i<=pPa
1b890 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b  ger->origDbSize;
1b8a0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
1b8b0 20 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e    if( !(pPager->
1b8c0 61 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20  aInJournal[i/8] 
1b8d0 26 20 28 31 3c 3c 28 69 26 37 29 29 29 20 29 7b  & (1<<(i&7))) ){
1b8e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1b8f0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  = sqlite3pager_g
1b900 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
1b910 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1b920 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b930 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1b940 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
1b950 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1b960 61 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65  ager_write(pPage
1b970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
1b980 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
1b990 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  f(pPage);.      
1b9a0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b9b0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1b9c0 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1b9d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
1b9e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
1b9f0 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
1ba00 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
1ba10 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  ager, zMaster);.
1ba20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ba30 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1ba40 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  ync_exit;.      
1ba50 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  rc = syncJournal
1ba60 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
1ba70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ba80 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1ba90 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64  it;.    }..#ifnd
1baa0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1bab0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
1bac0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
1bad0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1bae0 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
1baf0 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
1bb00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1bb10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1bb20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1bb30 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
1bb40 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
1bb50 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
1bb60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1bb70 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
1bb80 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
1bb90 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
1bba0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
1bbb0 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
1bbc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bbd0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1bbe0 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53  _exit;..    /* S
1bbf0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
1bc00 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66   file. */.    if
1bc10 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( !pPager->noSyn
1bc20 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  c ){.      rc = 
1bc30 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
1bc40 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20  Pager->fd);.    
1bc50 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  }..    pPager->s
1bc60 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e  tate = PAGER_SYN
1bc70 43 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  CED;.  }..sync_e
1bc80 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  xit:.  return rc
1bc90 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
1bca0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1bcb0 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  UUM./*.** Move t
1bcc0 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69  he page identifi
1bcd0 65 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c  ed by pData to l
1bce0 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20  ocation pgno in 
1bcf0 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  the file. .**.**
1bd00 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
1bd10 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
1bd20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
1bd30 20 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e   pgno. If curren
1bd40 74 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69  t page.** pgno i
1bd50 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e  s not already in
1bd60 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
1bd70 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
1bd80 20 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62   written there b
1bd90 79 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75  y.** by this rou
1bda0 74 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61  tine. The same a
1bdb0 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61  pplies to the pa
1bdc0 67 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20  ge pData refers 
1bdd0 74 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a  to on entry to.*
1bde0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a  * this routine..
1bdf0 2a 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73  **.** References
1be00 20 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66   to the page ref
1be10 65 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61  ered to by pData
1be20 20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55   remain valid. U
1be30 70 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d  pdating any.** m
1be40 65 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61  eta-data associa
1be50 74 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44  ted with page pD
1be60 61 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73  ata (i.e. data s
1be70 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
1be80 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
1be90 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
1bea0 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
1beb0 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
1bec0 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
1bed0 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
1bee0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
1bef0 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
1bf00 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
1bf10 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
1bf20 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
1bf30 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
1bf40 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
1bf50 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
1bf60 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
1bf70 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
1bf80 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
1bf90 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
1bfa0 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
1bfb0 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
1bfc0 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
1bfd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1bfe0 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67  ger_movepage(Pag
1bff0 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
1c000 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67   *pData, Pgno pg
1c010 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
1c020 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
1c030 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64  R(pData);.  PgHd
1c040 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e  r *pPgOld; .  in
1c050 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64  t h;.  Pgno need
1c060 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
1c070 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1c080 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45  ef>0 );..  TRACE
1c090 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  5("MOVE %d page 
1c0a0 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
1c0b0 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
1c0c0 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
1c0d0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1c0e0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1c0f0 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28  c, pgno);..  if(
1c100 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
1c110 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
1c120 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
1c130 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1c140 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
1c150 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
1c160 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65  irty );.    asse
1c170 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
1c180 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
1c190 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
1c1a0 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69  m it's hash-chai
1c1b0 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
1c1c0 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
1c1d0 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
1c1e0 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
1c1f0 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
1c200 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
1c210 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
1c220 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
1c230 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
1c240 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
1c250 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
1c260 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
1c270 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
1c280 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
1c290 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
1c2a0 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
1c2b0 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
1c2c0 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d  .  */.  pPgOld =
1c2d0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1c2e0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
1c2f0 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
1c300 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
1c310 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
1c320 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
1c330 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b  pPager, pPgOld);
1c340 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72  .    pPgOld->dir
1c350 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
1c360 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
1c370 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1c380 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72  ( pPgOld->inJour
1c390 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67  nal );.      pPg
1c3a0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1c3b0 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1c3c0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1c3d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c3e0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
1c3f0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e  }.  }..  /* Chan
1c400 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
1c410 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
1c420 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
1c430 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
1c440 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  . */.  pPg->pgno
1c450 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70   = pgno;.  h = p
1c460 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
1c470 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1c480 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
1c490 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1c4a0 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
1c4b0 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
1c4c0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
1c4d0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
1c4e0 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
1c4f0 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
1c500 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
1c510 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
1c520 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
1c530 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d  ash = 0;..  pPg-
1c540 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50  >dirty = 1;.  pP
1c550 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1c560 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
1c570 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
1c580 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
1c590 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
1c5a0 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1c5b0 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
1c5c0 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
1c5d0 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
1c5e0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
1c5f0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1c600 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
1c610 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
1c620 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
1c630 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
1c640 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
1c650 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
1c660 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
1c670 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
1c680 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
1c690 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
1c6a0 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
1c6b0 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
1c6c0 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
1c6d0 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1c6e0 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
1c6f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
1c700 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1c710 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
1c720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
1c730 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
1c740 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
1c750 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
1c760 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
1c770 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
1c780 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64  .    void *pNeed
1c790 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74  Sync;.    assert
1c7a0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1c7b0 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
1c7c0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1c7d0 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
1c7e0 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63  Pgno, &pNeedSync
1c7f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1c800 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1c810 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
1c820 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1c830 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1c840 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65  R(pNeedSync)->ne
1c850 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1c860 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e  DATA_TO_PGHDR(pN
1c870 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72  eedSync)->inJour
1c880 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54  nal = 1;.    DAT
1c890 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64  A_TO_PGHDR(pNeed
1c8a0 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31  Sync)->dirty = 1
1c8b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
1c8c0 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79  er_unref(pNeedSy
1c8d0 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  nc);.  }..  retu
1c8e0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1c8f0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1c900 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1c910 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1c920 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1c930 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1c940 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
1c950 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68  file lock for th
1c960 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
1c970 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1c980 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f  ue is one of NO_
1c990 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
1c9a0 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
1c9b0 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ,.** PENDING_LOC
1c9c0 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  K, or EXCLUSIVE_
1c9d0 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LOCK..*/.int sql
1c9e0 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74  ite3pager_lockst
1c9f0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
1ca00 72 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45  r){.#ifdef OS_TE
1ca10 53 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ST.  return pPag
1ca20 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74  er->fd->fd.lockt
1ca30 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ype;.#else.  ret
1ca40 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c  urn pPager->fd.l
1ca50 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a  ocktype;.#endif.
1ca60 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1ca70 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1ca80 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
1ca90 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
1caa0 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
1cab0 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
1cac0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1cad0 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
1cae0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1caf0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
1cb00 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
1cb10 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
1cb20 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1cb30 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
1cb40 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1cb50 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1cb60 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
1cb70 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
1cb80 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
1cb90 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
1cba0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
1cbb0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
1cbc0 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
1cbd0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
1cbe0 20 2a 2f 0a                                       */.