/ Hex Artifact Content
Login

Artifact 4c6c6a553d6d23ff6a3a50df5fe53f730f3e387f:


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: 39 20 32 30 30 35 2f 30 38 2f 32 31 20 31 36 3a  9 2005/08/21 16:
0360: 35 34 3a 32 35 20 64 72 68 20 45 78 70 20 24 0a  54:25 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 54 68 65 79 20 61 72 65 20 72 65 71  rs. They are req
0620: 75 69 72 65 64 20 73 6f 20 74 68 61 74 20 74 72  uired so that tr
0630: 61 63 69 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20  acing.** can be 
0640: 74 75 72 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75  turned on when u
0650: 73 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65  sing both the re
0660: 67 75 6c 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20  gular os_unix.c 
0670: 61 6e 64 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a  and os_test.c.**
0680: 20 62 61 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a   backends..**.**
0690: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
06a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
06b0: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
06c0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
06d0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06e0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
0700: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
0710: 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20  es an OsFile.** 
0720: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0730: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64  rgument..*/.#ifd
0740: 65 66 20 4f 53 5f 54 45 53 54 0a 23 64 65 66 69  ef OS_TEST.#defi
0750: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 70  ne PAGERID(p) (p
0760: 2d 3e 66 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66  ->fd->fd.h).#def
0770: 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  ine FILEHANDLEID
0780: 28 66 64 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a  (fd) (fd->fd.h).
0790: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
07a0: 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66 64 2e  GERID(p) (p->fd.
07b0: 68 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48  h).#define FILEH
07c0: 41 4e 44 4c 45 49 44 28 66 64 29 20 28 66 64 2e  ANDLEID(fd) (fd.
07d0: 68 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  h).#endif../*.**
07e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0800: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0820: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0830: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0840: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0850: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0860: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0870: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0880: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
08a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
08b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
08d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
08e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
08f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0910: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0920: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0930: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0940: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0950: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0980: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0990: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
09c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
09d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
09e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0a00: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0a10: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0a20: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0a30: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0a40: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0a50: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0a80: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0a90: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
0aa0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
0ad0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
0ae0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
0af0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0b10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0b20: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0b30: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0b60: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0b70: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
0bb0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0bc0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0bd0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
0be0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0c10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0c20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0c30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0c40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0c50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0c60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0c70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0c90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0ca0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0cb0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0cc0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0cd0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ce0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0cf0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0d00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0d10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0d20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0d30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0d60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0d70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0d80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0da0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0db0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0dc0: 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ove the.**      
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
0df0: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
0e00: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20  n will be.**    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a     committed..**
0e30: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0e40: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0e50: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0e60: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0e70: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  * sqlite3pager_g
0e80: 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65  et() occurs, the
0e90: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ea0: 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ns to PAGER_SHAR
0eb0: 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  ED..** After all
0ec0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0ed0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
0ee0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65  sqlite_page_unre
0ef0: 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74  f(),.** the stat
0f00: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61  e transitions ba
0f10: 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f  ck to PAGER_UNLO
0f20: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0f30: 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69  ime.** that sqli
0f40: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
0f50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0f60: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0f70: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f80: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f90: 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  hat sqlite_page_
0fa0: 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  write() can only
0fb0: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0fc0: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0fd0: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0fe0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0ff0: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
1000: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
1010: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
1020: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
1030: 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ED.).** The tran
1040: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
1050: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
1060: 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e 79   when before any
1070: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1080: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1090: 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74 65  base file.  Afte
10a0: 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  r an sqlite3page
10b0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  r_rollback().** 
10c0: 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72 5f  or sqlite_pager_
10d0: 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73 74  commit(), the st
10e0: 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74 6f  ate goes back to
10f0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
1100: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1110: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
1120: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52  efine PAGER_SHAR
1130: 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73  ED      1   /* s
1140: 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f  ame as SHARED_LO
1150: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1160: 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20  GER_RESERVED    
1170: 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52  2   /* same as R
1180: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a  ESERVED_LOCK */.
1190: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58  #define PAGER_EX
11a0: 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a  CLUSIVE   4   /*
11b0: 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49   same as EXCLUSI
11c0: 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  VE_LOCK */.#defi
11d0: 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  ne PAGER_SYNCED 
11e0: 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66       5../*.** If
11f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
1200: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d  _RESERVED_LOCK m
1210: 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74  acro is set to t
1220: 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  rue at compile-t
1230: 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69  ime,.** then fai
1240: 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20  led attempts to 
1250: 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  get a reserved l
1260: 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  ock will invoke 
1270: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1280: 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66  k..** This is of
1290: 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54  f by default.  T
12a0: 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69  o see why, consi
12b0: 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
12c0: 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a  g scenario:.** .
12d0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65 61  ** Suppose threa
12e0: 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  d A already has 
12f0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
1300: 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72 76  d wants a reserv
1310: 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65  ed lock..** Thre
1320: 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61 73  ad B already has
1330: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1340: 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78   and wants an ex
1350: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
1360: 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64  f.** both thread
1370: 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 69  s are using thei
1380: 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73  r busy callbacks
1390: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  , it might be a 
13a0: 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20  long time.** be 
13b0: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  for one of the t
13c0: 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20 61  hreads give up a
13d0: 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74  nd allows the ot
13e0: 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a  her to proceed..
13f0: 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 68  ** But if the th
1400: 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67  read trying to g
1410: 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64 20  et the reserved 
1420: 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71 75  lock gives up qu
1430: 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20  ickly.** (if it 
1440: 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74  never invokes it
1450: 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29  s busy callback)
1460: 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1470: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  tion will be.** 
1480: 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79  resolved quickly
1490: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
14a0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14b0: 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  D_LOCK.# define 
14c0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
14d0: 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64  RVED_LOCK 0.#end
14e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  if../*.** This m
14f0: 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75  acro rounds valu
1500: 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69 66  es up so that if
1510: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
1520: 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69   address it.** i
1530: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1540: 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74 68  be an address th
1550: 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f  at is aligned to
1560: 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
1570: 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ary..*/.#define 
1580: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
1590: 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37  X)   (((X)+7)&~7
15a0: 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  )../*.** Each in
15b0: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
15c0: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
15d0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
15e0: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
15f0: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1600: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1610: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1620: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1630: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1640: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1650: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1660: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1670: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1680: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1690: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
16a0: 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69  () on a page pri
16b0: 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20  or to making.** 
16c0: 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  any modification
16d0: 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20  s to that page. 
16e0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
16f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1700: 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  te().** is calle
1710: 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  d, the original 
1720: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
1730: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1740: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1750: 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72  ournal and PgHdr
1760: 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  .inJournal and P
1770: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72  gHdr.needSync ar
1780: 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f  e set.  Later, o
1790: 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  nce.** the journ
17a0: 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64 65  al page has made
17b0: 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73   it onto the dis
17c0: 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64 72  k surface, PgHdr
17d0: 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20  .needSync.** is 
17e0: 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f  cleared.  The mo
17f0: 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e  dified page cann
1800: 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 61  ot be written ba
1810: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  ck into the orig
1820: 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  inal.** database
1830: 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
1840: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61  journal pages ha
1850: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
1860: 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a   disk and the.**
1870: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
1880: 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
1890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64  ..**.** The PgHd
18a0: 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73 20  r.dirty flag is 
18b0: 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33  set when sqlite3
18c0: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
18d0: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
18e0: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
18f0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1900: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1910: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1920: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1930: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
1940: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
1950: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
1960: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
1970: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1980: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1990: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
19a0: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
19b0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
19e0: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
19f0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a00: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a10: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a20: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1a30: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1a40: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1a50: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1a60: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1a70: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1a80: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1a90: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1ab0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1ac0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1ad0: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
1ae0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
1af0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
1b00: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
1b10: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
1b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b30: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
1b40: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1b50: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
1b60: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b80: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
1b90: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
1ba0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
1bb0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1bd0: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77   if we need to w
1be0: 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65  rite back change
1bf0: 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  s */.  u8 needSy
1c00: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1c10: 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f        /* Sync jo
1c20: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69  urnal before wri
1c30: 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a  ting this page *
1c40: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1c50: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1c60: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f     /* Disable do
1c70: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
1c80: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1c90: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
1cc0: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
1cd0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
1ce0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1cf0: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
1d00: 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67 48  es sorted by PgH
1d10: 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66 64 65  dr.pgno */.#ifde
1d20: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1d30: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
1d40: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
1d50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d60: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
1d70: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
1d80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
1d90: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
1da0: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
1db0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
1dc0: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
1dd0: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
1de0: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
1df0: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
1e00: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
1e10: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
1e20: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
1e30: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
1e40: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
1e50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
1e60: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
1e70: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1e80: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
1e90: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
1ea0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
1eb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1ec0: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
1ed0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1ee0: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
1ef0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
1f00: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
1f10: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
1f20: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
1f30: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
1f40: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
1f50: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
1f60: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
1f70: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
1f80: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
1f90: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
1fa0: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
1fb0: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
1fc0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1fd0: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
1fe0: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
1ff0: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
2000: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2010: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
2020: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
2030: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
2040: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
2050: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
2060: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
2070: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
2080: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
2090: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
20a0: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
20b0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
20c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
20d0: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
20e0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
20f0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
2100: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
2110: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
2120: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2130: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
2140: 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50  C(P,D,N,X) if( P
2150: 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78  ->xCodec ){ P->x
2160: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2170: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c  rg,D,N,X); }.#el
2180: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
2190: 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69  C(P,D,N,X).#endi
21a0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
21b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
21c0: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
21d0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
21e0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
21f0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
2200: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
2210: 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31   ((void*)(&(P)[1
2220: 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41  ])).#define DATA
2230: 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26  _TO_PGHDR(D)  (&
2240: 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31  ((PgHdr*)(D))[-1
2250: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
2260: 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28  _TO_EXTRA(G,P) (
2270: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
2280: 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e  (&(G)[1]))[(P)->
2290: 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69  pageSize]).#defi
22a0: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ne PGHDR_TO_HIST
22b0: 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20  (P,PGR)  \.     
22c0: 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f         ((PgHisto
22d0: 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  ry*)&((char*)(&(
22e0: 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70  P)[1]))[(PGR)->p
22f0: 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e  ageSize+(PGR)->n
2300: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48  Extra])../*.** H
2310: 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74  ow big to make t
2320: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73  he hash table us
2330: 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  ed for locating 
2340: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a  in-memory pages.
2350: 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ** by page numbe
2360: 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 6c 6f  r. This macro lo
2370: 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73 69 6c  oks a little sil
2380: 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61 6c 75  ly, but is evalu
2390: 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d 70 69  ated.** at compi
23a0: 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72 75 6e  le-time, not run
23b0: 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73 74 20  -time (at least 
23c0: 66 6f 72 20 67 63 63 20 74 68 69 73 20 69 73 20  for gcc this is 
23d0: 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  true)..*/.#defin
23e0: 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c 0a 20  e N_PG_HASH (\. 
23f0: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30 32 34   (MAX_PAGES>1024
2400: 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d 41 58  )?2048: \.  (MAX
2410: 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30 32 34  _PAGES>512)?1024
2420: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2430: 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20 20 28  >256)?512: \.  (
2440: 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29 3f 32  MAX_PAGES>128)?2
2450: 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  56: \.  (MAX_PAG
2460: 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20 5c 0a  ES>64)?128:64 \.
2470: 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20  )../*.** Hash a 
2480: 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23  page number.*/.#
2490: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73  define pager_has
24a0: 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e 5f  h(PN)  ((PN)&(N_
24b0: 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a  PG_HASH-1))../*.
24c0: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
24d0: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
24e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
24f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
2500: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
2510: 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  {.  u8 journalOp
2520: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2530: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
2540: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
2550: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
2560: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
2570: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
2580: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
2590: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
25a0: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
25b0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
25c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
25d0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
25e0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
25f0: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2610: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
2620: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
2630: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
2640: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2650: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2660: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
2670: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2680: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
2690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26a0: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
26b0: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
26c0: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
26d0: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
26e0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
26f0: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
2700: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
2710: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
2720: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
2750: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
2760: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
2770: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2780: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
2790: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
27a0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
27b0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  ess */.  u8 stat
27c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27d0: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e       /* PAGER_UN
27e0: 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f  LOCK, _SHARED, _
27f0: 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a  RESERVED, etc. *
2800: 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20  /.  u8 errMask; 
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2830: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2840: 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  s */.  u8 tempFi
2850: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2860: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2870: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2880: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2890: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
28a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
28b0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
28c0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
28d0: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
28e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28f0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
2900: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
2910: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
2920: 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20  rtyCache;       
2930: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2940: 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68  f cached pages h
2950: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
2960: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
2970: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck;          /* 
2980: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
2990: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
29a0: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
29b0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
29c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
29d0: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
29e0: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
29f0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a10: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2a20: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2a30: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20  o jrnl */.  int 
2a40: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
2a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a60: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2a70: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2a80: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
2a90: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
2aa0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
2ab0: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
2ac0: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae0: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2af0: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
2b00: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
2b10: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b30: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2b40: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
2b50: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
2b60: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
2b70: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
2b80: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
2b90: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
2ba0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73  cksum */.  int s
2bb0: 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20  tmtNRec;        
2bc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2bd0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73   of records in s
2be0: 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  tmt subjournal *
2bf0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20  /.  int nExtra; 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
2c20: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
2c30: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2c40: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c70: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
2c80: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
2cc0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67  */.  int nMaxPag
2cd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ce0: 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d   /* High water m
2cf0: 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a  ark of nPage */.
2d00: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d20: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   Number of in-me
2d30: 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20  mory pages with 
2d40: 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a  PgHdr.nRef>0 */.
2d50: 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20    int mxPage;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d70: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2d80: 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64  of pages to hold
2d90: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 75   in cache */.  u
2da0: 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  8 *aInJournal;  
2db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2dc0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
2dd0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2de0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
2df0: 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20   *aInStmt;      
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2e10: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2e20: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2e30: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  se */.  char *zF
2e40: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
2e50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e60: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e70: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
2e80: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2e90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2ea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
2eb0: 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74  .  char *zDirect
2ec0: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ory;           /
2ed0: 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64  * Directory hold
2ee0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2ef0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20  urnal files */. 
2f00: 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b   OsFile fd, jfd;
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f20: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  File descriptors
2f30: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e   for database an
2f40: 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f  d journal */.  O
2f50: 73 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20  sFile stfd;     
2f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2f70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
2f80: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
2f90: 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42  subjournal*/.  B
2fa0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
2fb0: 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f  yHandler;  /* Po
2fc0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e  inter to sqlite.
2fd0: 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  busyHandler */. 
2fe0: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20   PgHdr *pFirst, 
2ff0: 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20  *pLast;      /* 
3000: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  List of free pag
3010: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
3020: 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20  FirstSynced;    
3030: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65      /* First fre
3040: 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64  e page with PgHd
3050: 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f  r.needSync==0 */
3060: 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20  .  PgHdr *pAll; 
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3080: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  * List of all pa
3090: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
30a0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
30b0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
30c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
30d0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
30e0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
30f0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
3100: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
3110: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
3120: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
3130: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
3140: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3150: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3160: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3170: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3180: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
31a0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
31b0: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
31c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
31d0: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
31e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
31f0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
3200: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
3210: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
3220: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3230: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
3240: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3250: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3260: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3270: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3280: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3290: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
32a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
32b0: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
32c0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
32d0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
32e0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
32f0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
3300: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
3310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3320: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
3330: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
3340: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3350: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
3360: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
3370: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3380: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
3390: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
33a0: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
33b0: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
33c0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
33d0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
33e0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
33f0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3400: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3410: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3420: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3430: 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20  oid *pCodecArg; 
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3450: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
3460: 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 50 67  xCodec() */.  Pg
3470: 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f  Hdr *aHash[N_PG_
3480: 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73  HASH];    /* Has
3490: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
34a0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
34b0: 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Hdr */.};../*.**
34c0: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
34d0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
34e0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
34f0: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
3500: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
3510: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3520: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3530: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3540: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3550: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3560: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
3570: 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63   are bits that c
3580: 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67  an be set in Pag
3590: 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23  er.errMask..*/.#
35a0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
35b0: 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20  _FULL     0x01  
35c0: 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69  /* a write() fai
35d0: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
35e0: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20  AGER_ERR_MEM    
35f0: 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f    0x02  /* mallo
3600: 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64  c() failed */.#d
3610: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3620: 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f  LOCK     0x04  /
3630: 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c  * error in the l
3640: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
3650: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3660: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78  _ERR_CORRUPT  0x
3670: 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20  08  /* database 
3680: 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  or journal corru
3690: 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ption */.#define
36a0: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20   PAGER_ERR_DISK 
36b0: 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e      0x10  /* gen
36c0: 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72  eral disk I/O er
36d0: 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20 64  ror - bad hard d
36e0: 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rive? */../*.** 
36f0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3700: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3710: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3720: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3730: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3740: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3750: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3760: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3770: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3780: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
37a0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
37b0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
37c0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
37d0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
37e0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
37f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3800: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
3810: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3820: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3830: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3840: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3850: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3860: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3870: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3880: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3890: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
38a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
38b0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
38c0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
38d0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
38e0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
38f0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3900: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3910: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3920: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3940: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3950: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3960: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3970: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3980: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3990: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
39a0: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
39b0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
39c0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
39d0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
39e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
39f0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3a00: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3a10: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3a20: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3a30: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3a40: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3a50: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3a60: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3a70: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3a80: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3a90: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3aa0: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3ab0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3ac0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3ad0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3ae0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3af0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3b00: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3b10: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3b20: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
3b30: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
3b40: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
3b50: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
3b60: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
3b70: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
3b80: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3b90: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3ba0: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
3bb0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
3bc0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
3bd0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
3be0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
3bf0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
3c00: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
3c10: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
3c20: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
3c30: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
3c40: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
3c50: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
3c60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
3c70: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
3c80: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
3c90: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
3ca0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
3cb0: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
3cc0: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
3cd0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
3ce0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
3cf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
3d00: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
3d10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3d20: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
3d30: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
3d40: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
3d50: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
3d60: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
3d70: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
3d80: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
3d90: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
3da0: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
3db0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
3dc0: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
3dd0: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
3de0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3df0: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
3e00: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
3e10: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
3e20: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
3e30: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
3e40: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
3e50: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
3e60: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
3e70: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
3e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
3e90: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
3ea0: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
3eb0: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
3ec0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
3ed0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
3ee0: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
3ef0: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
3f00: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
3f10: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3f20: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
3f30: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
3f40: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3f50: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
3f60: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
3f70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 69  * The default si
3f80: 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63  ze of a disk sec
3f90: 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  tor.*/.#define P
3fa0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
3fb0: 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65   512../*.** Page
3fc0: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
3fd0: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
3fe0: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
3ff0: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
4000: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
4010: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
4020: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
4030: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
4040: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
4050: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
4060: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
4070: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
4080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4090: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
40a0: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
40b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
40c0: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
40d0: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
40e0: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
40f0: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
4100: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
4110: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
4120: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64  etails..*/./* #d
4130: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
4140: 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f  GNO(x) (PENDING_
4150: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
4160: 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ize)) */.#define
4170: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4180: 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  ) ((PENDING_BYTE
4190: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
41a0: 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )+1)../*.** The 
41b0: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
41c0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
41d0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
41e0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
41f0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
4200: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65  *.** Enable refe
4210: 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
4220: 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67  king (for debugg
4230: 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69  ing) here:.*/.#i
4240: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4250: 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72  G.  int pager3_r
4260: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20  efinfo_enable = 
4270: 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  0;.  static void
4280: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50   pager_refinfo(P
4290: 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74  gHdr *p){.    st
42a0: 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30  atic int cnt = 0
42b0: 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72  ;.    if( !pager
42c0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
42d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
42e0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
42f0: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
4300: 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e  T: %4d addr=%p n
4310: 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Ref=%d\n",.     
4320: 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52    p->pgno, PGHDR
4330: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
4340: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
4350: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
4360: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
4370: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
4380: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
4390: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
43a0: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
43b0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
43c0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
43d0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
43e0: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
43f0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4400: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
4410: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
4420: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
4430: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
4440: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
4450: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
4460: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
4470: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4480: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4490: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
44a0: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
44b0: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
44c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
44d0: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
44e0: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
44f0: 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  u32 res;.  int r
4500: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
4510: 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  3OsRead(fd, &res
4520: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
4530: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4540: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  _OK ){.    unsig
4550: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4560: 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26      memcpy(ac, &
4570: 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73  res, 4);.    res
4580: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
4590: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
45a0: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
45b0: 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  ];.  }.  *pRes =
45c0: 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72   res;.  return r
45d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
45e0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
45f0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
4600: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4610: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4620: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4630: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4640: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4650: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4660: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4670: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4680: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75  d, u32 val){.  u
4690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
46a0: 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  4];.  ac[0] = (v
46b0: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
46c0: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
46d0: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
46e0: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
46f0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
4700: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
4710: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
4720: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
4730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4740: 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  the 32-bit integ
4750: 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68  er 'val' into th
4760: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
4770: 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72  d by page header
4780: 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65  .** 'p' at offse
4790: 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73  t 'offset'..*/.s
47a0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
47b0: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
47c0: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
47d0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
47e0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
47f0: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
4800: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
4810: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
4820: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4830: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4840: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4850: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4860: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4870: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4880: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
4890: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
48a0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
48b0: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
48c0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
48d0: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
48e0: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
48f0: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4900: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4910: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4930: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4940: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4950: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4960: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4970: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4980: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4990: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
49a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
49b0: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
49c0: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
49d0: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
49e0: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
49f0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
4a00: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
4a10: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
4a20: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4a30: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
4a40: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4a50: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
4a60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a70: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
4a80: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4a90: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
4aa0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
4ab0: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
4ac0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4ad0: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4ae0: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4af0: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4b00: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4b10: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4b20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4b30: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
4b40: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4b50: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
4b60: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
4b70: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
4b80: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
4b90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4ba0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
4bb0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
4bc0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
4bd0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
4be0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
4bf0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4c00: 65 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  e){.  u32 hash =
4c10: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75   0;.  int i;.  u
4c20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4c30: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
4c40: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
4c50: 44 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66  DATA(pPage);.  f
4c60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
4c70: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
4c80: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4c90: 68 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61  h = (hash+i)^pDa
4ca0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
4cb0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a  urn hash;.}../*.
4cc0: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
4cd0: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
4ce0: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
4cf0: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
4d00: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
4d10: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
4d20: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
4d30: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
4d40: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
4d50: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
4d60: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
4d70: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
4d80: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
4d90: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
4da0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
4db0: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
4dc0: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
4dd0: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
4de0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
4df0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4e00: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
4e10: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
4e20: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   || pPager->errM
4e30: 61 73 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  ask || MEMDB || 
4e40: 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20  pPg->dirty || . 
4e50: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
4e60: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
4e70: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
4e80: 6c 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43  lse.#define CHEC
4e90: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
4ea0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
4eb0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
4ec0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
4ed0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
4ee0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
4ef0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
4f00: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
4f10: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
4f20: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
4f30: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
4f40: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4f50: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4f60: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
4f70: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
4f80: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
4f90: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
4fa0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
4fb0: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
4fc0: 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73  iteFree() *pzMas
4fd0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ter..**.** If no
4fe0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4ff0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
5000: 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69  sent *pzMaster i
5010: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
5020: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
5030: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
5040: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
5050: 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a  urnal(OsFile *pJ
5060: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
5070: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5080: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
5090: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
50a0: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
50b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
50c0: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
50d0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
50e0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
50f0: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
5100: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5110: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
5120: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
5130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5140: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
5150: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
5160: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
5170: 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28  , szJ-16);.  if(
5180: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5190: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20   return rc;. .  
51a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
51b0: 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20  pJrnl, &len);.  
51c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
51d0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
51e0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
51f0: 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29  s(pJrnl, &cksum)
5200: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5210: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5220: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5230: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
5240: 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66  aMagic, 8);.  if
5250: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5260: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
5270: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
5280: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
5290: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
52a0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
52b0: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
52c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
52d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a   return rc;..  *
52e0: 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72  pzMaster = (char
52f0: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
5300: 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a  len+1);.  if( !*
5310: 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  pzMaster ){.    
5320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5330: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
5340: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5350: 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20  rnl, *pzMaster, 
5360: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
5370: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5380: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
5390: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
53a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
53b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
53c0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
53d0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
53e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
53f0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
5400: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
5410: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
5420: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a  (*pzMaster)[i];.
5430: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
5440: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
5450: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
5460: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
5470: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
5480: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
5490: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
54a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
54b0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
54c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
54d0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
54e0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
54f0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
5500: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
5510: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
5520: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
5530: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
5540: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5550: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
5560: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
5570: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
5580: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e   (*pzMaster)[len
5590: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
55a0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
55b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
55c0: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  eek the journal 
55d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
55e0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
55f0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72  or boundary wher
5600: 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  e a.** journal h
5610: 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61  eader may be rea
5620: 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61  d or written. Pa
5630: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  ger.journalOff i
5640: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a  s updated with.*
5650: 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f  * the new seek o
5660: 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ffset..**.** i.e
5670: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
5680: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
5690: 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20   Input Offset   
56a0: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
56b0: 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d  t Offset.** ----
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20  ---.** 0        
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20   0.** 512       
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20  512.** 100      
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20   512.** 2000    
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
5770: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75  atic int seekJou
5780: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
5790: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
57a0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
57b0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
57c0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
57d0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
57e0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
57f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
5800: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
5810: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
5820: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
5830: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
5840: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
5850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
5860: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
5870: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
5880: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5890: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
58a0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
58b0: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  et;.  return sql
58c0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
58d0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
58e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a  >journalOff);.}.
58f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5900: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
5910: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
5920: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5930: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
5940: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
5950: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
5960: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
5970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
5980: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5990: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
59a0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
59b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
59c0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
59d0: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
59e0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
59f0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
5a00: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
5a10: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
5a20: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
5a30: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
5a40: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
5a50: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
5a60: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
5a70: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
5a80: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
5a90: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
5aa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5ab0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
5ac0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
5ad0: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
5ae0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
5af0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
5b00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
5b10: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
5b20: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
5b30: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
5b40: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5b50: 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63  ager){..  int rc
5b60: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5b70: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5b80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5b90: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5ba0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5bb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5bc0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5bd0: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5be0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5bf0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5c00: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5c10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5c20: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5c30: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
5c40: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
5c50: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
5c60: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
5c70: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
5c80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
5c90: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
5ca0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
5cb0: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
5cc0: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
5cd0: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
5ce0: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
5cf0: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
5d00: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
5d10: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
5d20: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
5d30: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
5d40: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
5d50: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
5d60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
5d70: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
5d80: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
5d90: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
5da0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
5db0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5dc0: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
5dd0: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
5de0: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
5df0: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  . */.    rc = wr
5e00: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5e10: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5e20: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
5e30: 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
5e40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5e50: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
5e60: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
5e70: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
5e80: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e   .    sqlite3Ran
5e90: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
5ea0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5eb0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
5ec0: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d  mInit);.    rc =
5ed0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5ee0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5ef0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
5f00: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5f10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5f20: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
5f30: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
5f40: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
5f50: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5f60: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
5f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
5f80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5f90: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
5fa0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
5fb0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
5fc0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5fd0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5fe0: 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  d, pPager->secto
5ff0: 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rSize);.  }..  /
6000: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
6010: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
6020: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
6030: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
6040: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
6050: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
6060: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
6070: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
6080: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
6090: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
60a0: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
60b0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
60c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
60d0: 66 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  f-1);.    rc = s
60e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
60f0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
6100: 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65  0", 1);.  }.  re
6110: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6120: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
6130: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
6140: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
6150: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
6160: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
6170: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
6180: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
6190: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
61a0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
61b0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53  urnal.** file. S
61c0: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76  ee comments abov
61d0: 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  e function write
61e0: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72  JournalHdr() for
61f0: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f   a description o
6200: 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  f.** the journal
6210: 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a   header format..
6220: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61  **.** If the hea
6230: 64 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63  der is read succ
6240: 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20  essfully, *nRec 
6250: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75  is set to the nu
6260: 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20  mber of.** page 
6270: 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e  records followin
6280: 67 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e  g this header an
6290: 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74  d *dbSize is set
62a0: 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
62b0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
62c0: 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73  before the trans
62d0: 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e  action began, in
62e0: 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50   pages. Also, pP
62f0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a  ager->cksumInit.
6300: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ** is set to the
6310: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
6320: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
6330: 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  der. SQLITE_OK i
6340: 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e  s returned.** in
6350: 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
6360: 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
6370: 20 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70   header file app
6380: 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75  ears to be corru
6390: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
63a0: 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  E is.** returned
63b0: 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a   and *nRec and *
63c0: 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73  dbSize are not s
63d0: 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f  et.  If JOURNAL_
63e0: 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20  HDR_SZ bytes.** 
63f0: 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66  cannot be read f
6400: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
6410: 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f  file an error co
6420: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
6430: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
6440: 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20  adJournalHdr(.  
6450: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a  Pager *pPager, .
6460: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a    i64 journalSiz
6470: 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c  e,.  u32 *pNRec,
6480: 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65   .  u32 *pDbSize
6490: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
64a0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
64b0: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
64c0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
64d0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
64e0: 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75  ..  rc = seekJou
64f0: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
6500: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6510: 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  rn rc;..  if( pP
6520: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6530: 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  +JOURNAL_HDR_SZ(
6540: 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61  pPager) > journa
6550: 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  lSize ){.    ret
6560: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
6570: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
6580: 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
6590: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
65a0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
65b0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
65c0: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d  urn rc;..  if( m
65d0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
65e0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
65f0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
6600: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6610: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
6620: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6630: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
6640: 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63  pNRec);.  if( rc
6650: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6660: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
6670: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
6680: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6690: 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  t);.  if( rc ) r
66a0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
66b0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50  = read32bits(&pP
66c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69  ager->jfd, pDbSi
66d0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
66e0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
66f0: 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75   Update the assu
6700: 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  med sector-size 
6710: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
6720: 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a  ue used by .  **
6730: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
6740: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
6750: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
6760: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a  journal was.  **
6770: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
6780: 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e  ocess other than
6790: 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20   this one, then 
67a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a  this routine.  *
67b0: 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65  * is being calle
67c0: 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61  d from within pa
67d0: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20  ger_playback(). 
67e0: 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a  The local value.
67f0: 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65    ** of Pager.se
6800: 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74  ctorSize is rest
6810: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 20  ored at the end 
6820: 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e  of that routine.
6830: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
6840: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
6850: 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50  >jfd, (u32 *)&pP
6860: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
6870: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6880: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
6890: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
68a0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
68b0: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
68c0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
68d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
68e0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
68f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
6900: 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  .../*.** Write t
6910: 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74  he supplied mast
6920: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
6930: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
6940: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a   file for pager.
6950: 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65  ** pPager at the
6960: 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f   current locatio
6970: 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  n. The master jo
6980: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20  urnal name must 
6990: 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74  be the last.** t
69a0: 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  hing written to 
69b0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
69c0: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
69d0: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
69e0: 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  e, the.** journa
69f0: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
6a00: 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f  r is advanced to
6a10: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
6a20: 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65   boundary before
6a30: 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20  .** anything is 
6a40: 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72  written. The for
6a50: 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20  mat is:.**.** + 
6a60: 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d  4 bytes: PAGER_M
6a70: 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62  J_PGNO..** + N b
6a80: 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20  ytes: length of 
6a90: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6aa0: 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  ame..** + 4 byte
6ab0: 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65  s: N.** + 4 byte
6ac0: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
6ad0: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
6ae0: 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61  .** + 8 bytes: a
6af0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
6b00: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
6b10: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
6b20: 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
6b30: 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
6b40: 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
6b50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2f  journal name..*/
6b60: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
6b70: 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50  eMasterJournal(P
6b80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f  ager *pPager, co
6b90: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
6ba0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
6bb0: 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20  int len; .  int 
6bc0: 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20  i; .  u32 cksum 
6bd0: 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d  = 0; ..  if( !zM
6be0: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
6bf0: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
6c00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6c10: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
6c20: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
6c30: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
6c40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
6c50: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
6c60: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
6c70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
6c80: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
6c90: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
6ca0: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
6cb0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
6cc0: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
6cd0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
6ce0: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
6cf0: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
6d00: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
6d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
6d20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
6d30: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
6d40: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
6d50: 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  c ){.    rc = se
6d60: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
6d70: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
6d80: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6d90: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
6da0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6db0: 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a  f += (len+20);..
6dc0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
6dd0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
6de0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
6df0: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
6e00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6e10: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6e20: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
6e30: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  (&pPager->jfd, z
6e40: 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20  Master, len);.  
6e50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6e60: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
6e70: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
6e80: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
6e90: 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21   len);.  if( rc!
6ea0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6eb0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6ec0: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
6ed0: 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73 75 6d 29  ger->jfd, cksum)
6ee0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
6ef0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6f00: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
6f10: 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
6f20: 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c  r->jfd, aJournal
6f30: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a  Magic, sizeof(aJ
6f40: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
6f50: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
6f60: 63 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  c = 1;.  return 
6f70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
6f80: 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67   or remove a pag
6f90: 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
6fa0: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61  of all pages tha
6fb0: 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20  t are in the.** 
6fc0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
6fd0: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67  l..**.** The Pag
6fe0: 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72  er keeps a separ
6ff0: 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ate list of page
7000: 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  s that are curre
7010: 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ntly in.** the s
7020: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
7030: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68  .  This helps th
7040: 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  e sqlite3pager_s
7050: 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20  tmt_commit().** 
7060: 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48  routine run MUCH
7070: 20 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20   faster for the 
7080: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72  common case wher
7090: 65 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79  e there are many
70a0: 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d  .** pages in mem
70b0: 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66  ory but only a f
70c0: 65 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ew are in the st
70d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
70e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
70f0: 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
7100: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
7110: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
7120: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
7130: 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53  ;.  if( pPg->inS
7140: 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  tmt ) return;.  
7150: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72  assert( pPg->pPr
7160: 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67  evStmt==0 && pPg
7170: 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29  ->pNextStmt==0 )
7180: 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74  ;.  pPg->pPrevSt
7190: 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  mt = 0;.  if( pP
71a0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  ager->pStmt ){. 
71b0: 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
71c0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
71d0: 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  g;.  }.  pPg->pN
71e0: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
71f0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65  ->pStmt;.  pPage
7200: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a  r->pStmt = pPg;.
7210: 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
7220: 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  1;.}.static void
7230: 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
7240: 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64  m_stmt_list(PgHd
7250: 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21  r *pPg){.  if( !
7260: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65  pPg->inStmt ) re
7270: 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d  turn;.  if( pPg-
7280: 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20  >pPrevStmt ){.  
7290: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
72a0: 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53  PrevStmt->pNextS
72b0: 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  tmt==pPg );.    
72c0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e  pPg->pPrevStmt->
72d0: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d  pNextStmt = pPg-
72e0: 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65  >pNextStmt;.  }e
72f0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7300: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53   pPg->pPager->pS
7310: 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  tmt==pPg );.    
7320: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74  pPg->pPager->pSt
7330: 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53  mt = pPg->pNextS
7340: 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  tmt;.  }.  if( p
7350: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b  Pg->pNextStmt ){
7360: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
7370: 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72  ->pNextStmt->pPr
7380: 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  evStmt==pPg );. 
7390: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d     pPg->pNextStm
73a0: 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
73b0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20  Pg->pPrevStmt;. 
73c0: 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53   }.  pPg->pNextS
73d0: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  tmt = 0;.  pPg->
73e0: 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20  pPrevStmt = 0;. 
73f0: 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
7400: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
7410: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61  a page in the ha
7420: 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69  sh table given i
7430: 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  ts page number. 
7440: 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69   Return.** a poi
7450: 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
7460: 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20   or NULL if not 
7470: 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  found..*/.static
7480: 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f   PgHdr *pager_lo
7490: 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
74a0: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
74b0: 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61    PgHdr *p = pPa
74c0: 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72  ger->aHash[pager
74d0: 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20  _hash(pgno)];.  
74e0: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70  while( p && p->p
74f0: 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20  gno!=pgno ){.   
7500: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73   p = p->pNextHas
7510: 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  h;.  }.  return 
7520: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  p;.}../*.** Unlo
7530: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ck the database 
7540: 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e  and clear the in
7550: 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
7560: 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
7570: 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
7580: 66 20 74 68 65 20 70 61 67 65 72 20 62 61 63 6b  f the pager back
7590: 20 74 6f 20 77 68 61 74 20 69 74 20 77 61 73 20   to what it was 
75a0: 77 68 65 6e 20 69 74 20 77 61 73 20 66 69 72 73  when it was firs
75b0: 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e  t.** opened.  An
75c0: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  y outstanding pa
75d0: 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
75e0: 74 65 64 20 61 6e 64 20 73 75 62 73 65 71 75 65  ted and subseque
75f0: 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74  nt attempts.** t
7600: 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65 20 70  o access those p
7610: 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  ages will likely
7620: 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
7630: 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  edump..*/.static
7640: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65   void pager_rese
7650: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
7660: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
7670: 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 50  *pNext;.  if( pP
7680: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 29 20  ager->errMask ) 
7690: 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 70 50  return;.  for(pP
76a0: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
76b0: 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
76c0: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
76d0: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
76e0: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
76f0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70  .  }.  pPager->p
7700: 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61  First = 0;.  pPa
7710: 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
7720: 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  d = 0;.  pPager-
7730: 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50  >pLast = 0;.  pP
7740: 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a  ager->pAll = 0;.
7750: 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
7760: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
7770: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
7780: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  );.  pPager->nPa
7790: 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ge = 0;.  if( pP
77a0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
77b0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
77c0: 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
77d0: 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
77e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
77f0: 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
7800: 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
7810: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
7820: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
7830: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
7840: 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  = -1;.  pPager->
7850: 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65  nRef = 0;.  asse
7860: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
7870: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a  nalOpen==0 );.}.
7880: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
7890: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
78a0: 72 65 73 65 74 20 74 68 65 20 70 61 67 65 72 20  reset the pager 
78b0: 61 66 74 65 72 20 61 20 6d 61 6c 6c 6f 63 28 29  after a malloc()
78c0: 20 66 61 69 6c 75 72 65 2e 20 54 68 69 73 0a 2a   failure. This.*
78d0: 2a 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b 20 77  * doesn't work w
78e0: 69 74 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  ith in-memory da
78f0: 74 61 62 61 73 65 73 2e 20 49 66 20 61 20 6d 61  tabases. If a ma
7900: 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 77 68 65  lloc() fails whe
7910: 6e 20 61 6e 20 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  n an .** in-memo
7920: 72 79 20 64 61 74 61 62 61 73 65 20 69 73 20 69  ry database is i
7930: 6e 20 75 73 65 20 69 74 20 69 73 20 6e 6f 74 20  n use it is not 
7940: 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65 63 6f  possible to reco
7950: 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ver..**.** If a 
7960: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 73  transaction or s
7970: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
7980: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20  tion is active, 
7990: 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  it is rolled bac
79a0: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  k..**.** It is a
79b0: 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c 6c 20  n error to call 
79c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 66  this function if
79d0: 20 61 6e 79 20 70 61 67 65 73 20 61 72 65 20 69   any pages are i
79e0: 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65  n use..*/.#ifnde
79f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c  f SQLITE_OMIT_GL
7a00: 4f 42 41 4c 52 45 43 4f 56 45 52 0a 69 6e 74 20  OBALRECOVER.int 
7a10: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 73  sqlite3pager_res
7a20: 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
7a30: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 20  ){.  if( pPager 
7a40: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
7a50: 72 2d 3e 6e 52 65 66 20 7c 7c 20 4d 45 4d 44 42  r->nRef || MEMDB
7a60: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
7a70: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
7a80: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
7a90: 3e 65 72 72 4d 61 73 6b 20 26 3d 20 7e 28 50 41  >errMask &= ~(PA
7aa0: 47 45 52 5f 45 52 52 5f 4d 45 4d 29 3b 0a 20 20  GER_ERR_MEM);.  
7ab0: 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
7ac0: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ager);.  }.  ret
7ad0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7ae0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
7af0: 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
7b00: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
7b10: 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20 6a   pager has the j
7b20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
7b30: 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56   and.** a RESERV
7b40: 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
7b50: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
7b60: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
7b70: 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a 20  ine releases.** 
7b80: 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63  the database loc
7b90: 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61  k and acquires a
7ba0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e 20   SHARED lock in 
7bb0: 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65 20  its place.  The 
7bc0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
7bd0: 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20 63  is deleted and c
7be0: 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  losed..**.** TOD
7bf0: 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65 70  O: Consider keep
7c00: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
7c10: 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74 65  file open for te
7c20: 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
7c30: 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68 74  s..** This might
7c40: 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d 61   give a performa
7c50: 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20  nce improvement 
7c60: 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72 65  on windows where
7c70: 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66 69   opening.** a fi
7c80: 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73 69  le is an expensi
7c90: 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  ve operation..*/
7ca0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
7cb0: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50 61  r_unwritelock(Pa
7cc0: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
7cd0: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
7ce0: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
7cf0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20  !MEMDB );.  if( 
7d00: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
7d10: 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
7d20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7d30: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  E_OK;.  }.  sqli
7d40: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
7d50: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
7d60: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
7d70: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
7d80: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
7d90: 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70  er->stfd);.    p
7da0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
7db0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = 0;.  }.  if( p
7dc0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
7dd0: 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  en ){.    sqlite
7de0: 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72  3OsClose(&pPager
7df0: 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61 67  ->jfd);.    pPag
7e00: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
7e10: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
7e20: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
7e30: 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  >zJournal);.    
7e40: 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61 67  sqliteFree( pPag
7e50: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 29  er->aInJournal )
7e60: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
7e70: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
7e80: 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
7e90: 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
7ea0: 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
7eb0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
7ec0: 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  urnal = 0;.     
7ed0: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
7ee0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
7ef0: 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  Sync = 0;.#ifdef
7f00: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
7f10: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
7f20: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
7f30: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
7f40: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
7f50: 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
7f60: 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  he = 0;.    pPag
7f70: 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
7f80: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7f90: 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
7fa0: 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  urnal==0 );.    
7fb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7fc0: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
7fd0: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
7fe0: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
7ff0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
8000: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
8010: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
8020: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
8030: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
8040: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
8050: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
8060: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
8070: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
8080: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
8090: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
80a0: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
80b0: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
80c0: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
80d0: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
80e0: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
80f0: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
8100: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
8110: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
8120: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
8130: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
8140: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
8150: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
8160: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
8170: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
8180: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
8190: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
81a0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
81b0: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
81c0: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
81d0: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
81e0: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
81f0: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
8200: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
8210: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
8220: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
8230: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
8240: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
8250: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
8260: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
8270: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
8280: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
8290: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
82a0: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
82b0: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
82c0: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
82d0: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
82e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
82f0: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
8300: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
8310: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
8320: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
8330: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
8340: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
8350: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
8360: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
8370: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
8380: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
8390: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
83a0: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
83b0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
83c0: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
83d0: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
83e0: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
83f0: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
8400: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
8410: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
8420: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
8430: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
8440: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
8450: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
8460: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
8470: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
8480: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
8490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
84a0: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
84b0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
84c0: 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  pgno, const char
84d0: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
84e0: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
84f0: 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74  cksumInit;.  int
8500: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
8510: 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69  eSize-200;.  whi
8520: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
8530: 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
8540: 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
8550: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
8560: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  um;.}../*.** Rea
8570: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
8580: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
8590: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
85a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
85b0: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
85c0: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
85d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73  .**.** If useCks
85e0: 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  um==0 it means t
85f0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  his journal does
8600: 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75   not use checksu
8610: 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a  ms.  Checksums.*
8620: 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69  * are not used i
8630: 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  n statement jour
8640: 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61  nals because sta
8650: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
8660: 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74  do not.** need t
8670: 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20  o survive power 
8680: 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  failures..*/.sta
8690: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
86a0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
86b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f  Pager *pPager, O
86c0: 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20  sFile *jfd, int 
86d0: 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74  useCksum){.  int
86e0: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
86f0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
8700: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
8710: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
8720: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
8730: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
8740: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8750: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
8760: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
8770: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
87a0: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
87b0: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
87c0: 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41   aData[SQLITE_MA
87d0: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f  X_PAGE_SIZE];  /
87e0: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66  * Temp storage f
87f0: 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20  or a page */..  
8800: 2f 2a 20 75 73 65 43 6b 73 75 6d 20 73 68 6f 75  /* useCksum shou
8810: 6c 64 20 62 65 20 74 72 75 65 20 66 6f 72 20 74  ld be true for t
8820: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
8830: 61 6e 64 20 66 61 6c 73 65 20 66 6f 72 0a 20 20  and false for.  
8840: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
8850: 72 6e 61 6c 73 2e 20 20 56 65 72 69 66 79 20 74  rnals.  Verify t
8860: 68 61 74 20 74 68 69 73 20 69 73 20 61 6c 77 61  hat this is alwa
8870: 79 73 20 74 68 65 20 63 61 73 65 0a 20 20 2a 2f  ys the case.  */
8880: 0a 20 20 61 73 73 65 72 74 28 20 6a 66 64 20 3d  .  assert( jfd =
8890: 3d 20 28 75 73 65 43 6b 73 75 6d 20 3f 20 26 70  = (useCksum ? &p
88a0: 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 26 70 50  Pager->jfd : &pP
88b0: 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b 0a 0a  ager->stfd) );..
88c0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
88d0: 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a  ts(jfd, &pgno);.
88e0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
88f0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8900: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8910: 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61 74  sRead(jfd, &aDat
8920: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
8930: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
8940: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
8950: 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d  rn rc;.  pPager-
8960: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
8970: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
8980: 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74  + 4;..  /* Sanit
8990: 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68  y checking on th
89a0: 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69 73  e page.  This is
89b0: 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74 20   more important 
89c0: 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c  that I originall
89d0: 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20  y.  ** thought. 
89e0: 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69 6c   If a power fail
89f0: 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ure occurs while
8a00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
8a10: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20  being written,. 
8a20: 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61 75   ** it could cau
8a30: 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  se invalid data 
8a40: 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  to be written in
8a50: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  to the journal. 
8a60: 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a   We need to.  **
8a70: 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e 76   detect this inv
8a80: 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68 20  alid data (with 
8a90: 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74 79  high probability
8aa0: 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  ) and ignore it.
8ab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
8ac0: 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
8ad0: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
8ae0: 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
8af0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
8b00: 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e  }.  if( pgno>(un
8b10: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
8b20: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
8b30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
8b40: 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73 75   }.  if( useCksu
8b50: 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65  m ){.    rc = re
8b60: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 63  ad32bits(jfd, &c
8b70: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
8b80: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
8b90: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
8ba0: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
8bb0: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
8bc0: 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44  pPager, pgno, aD
8bd0: 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20  ata)!=cksum ){. 
8be0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8bf0: 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  TE_DONE;.    }. 
8c00: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
8c10: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
8c20: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
8c30: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
8c40: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
8c50: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
8c60: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
8c70: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
8c80: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
8c90: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
8ca0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
8cb0: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
8cc0: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
8cd0: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
8ce0: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
8cf0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
8d00: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
8d10: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
8d20: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
8d30: 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c  .  ** If in EXCL
8d40: 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68 65  USIVE state, the
8d50: 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65 20  n we update the 
8d60: 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20 69  pager cache if i
8d70: 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e  t exists.  ** an
8d80: 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e  d the main file.
8d90: 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68 65   The page is the
8da0: 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72  n marked not dir
8db0: 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69  ty..  **.  ** Ti
8dc0: 63 6b 65 74 20 23 31 31 37 31 3a 20 20 54 68 65  cket #1171:  The
8dd0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8de0: 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
8df0: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68   page content th
8e00: 61 74 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65  at is.  ** diffe
8e10: 72 65 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61  rent from the pa
8e20: 67 65 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68  ge content at th
8e30: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 74  e start of the t
8e40: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
8e50: 20 54 68 69 73 20 6f 63 63 75 72 73 20 77 68 65   This occurs whe
8e60: 6e 20 61 20 70 61 67 65 20 69 73 20 63 68 61 6e  n a page is chan
8e70: 67 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ged prior to the
8e80: 20 73 74 61 72 74 20 6f 66 20 61 20 73 74 61 74   start of a stat
8e90: 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20  ement.  ** then 
8ea0: 63 68 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69  changed again wi
8eb0: 74 68 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  thin the stateme
8ec0: 6e 74 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e  nt.  When rollin
8ed0: 67 20 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20  g back such a.  
8ee0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20  ** statement we 
8ef0: 6d 75 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74  must not write t
8f00: 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
8f10: 61 74 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77  atabase unless w
8f20: 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20  e know.  ** for 
8f30: 63 65 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69  certain that ori
8f40: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
8f50: 6e 74 73 20 61 72 65 20 69 6e 20 74 68 65 20 6d  nts are in the m
8f60: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
8f70: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
8f80: 72 77 69 73 65 2c 20 69 66 20 61 20 66 75 6c 6c  rwise, if a full
8f90: 20 52 4f 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73   ROLLBACK occurs
8fa0: 20 61 66 74 65 72 20 74 68 65 20 73 74 61 74 65   after the state
8fb0: 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61  ment.  ** rollba
8fc0: 63 6b 20 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c  ck the full ROLL
8fd0: 42 41 43 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65  BACK will not re
8fe0: 73 74 6f 72 65 20 74 68 65 20 70 61 67 65 20 74  store the page t
8ff0: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  o its original. 
9000: 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77   ** content.  Tw
9010: 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73  o conditions mus
9020: 74 20 62 65 20 6d 65 74 20 62 65 66 6f 72 65 20  t be met before 
9030: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
9040: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c  atabase.  ** fil
9050: 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61  es. (1) the data
9060: 62 61 73 65 20 6d 75 73 74 20 62 65 20 6c 6f 63  base must be loc
9070: 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
9080: 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
9090: 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f  nal.  ** page co
90a0: 6e 74 65 6e 74 20 69 73 20 69 6e 20 74 68 65 20  ntent is in the 
90b0: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74  main journal eit
90c0: 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20  her because the 
90d0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20  page is not in. 
90e0: 20 2a 2a 20 63 61 63 68 65 20 6f 72 20 65 6c 73   ** cache or els
90f0: 65 20 69 74 20 69 73 20 6d 61 72 6b 65 64 20 61  e it is marked a
9100: 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20  s needSync==0.. 
9110: 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61 67 65   */.  pPg = page
9120: 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
9130: 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74   pgno);.  assert
9140: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
9150: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9160: 20 7c 7c 20 70 50 67 21 3d 30 20 29 3b 0a 20 20   || pPg!=0 );.  
9170: 54 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b  TRACE3("PLAYBACK
9180: 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
9190: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
91a0: 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
91b0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
91c0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20  ER_EXCLUSIVE && 
91d0: 28 70 50 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  (pPg==0 || pPg->
91e0: 6e 65 65 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a  needSync==0) ){.
91f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
9200: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
9210: 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
9220: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9230: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9240: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
9250: 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67  >fd, aData, pPag
9260: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9270: 20 20 20 69 66 28 20 70 50 67 20 29 20 70 50 67     if( pPg ) pPg
9280: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d  ->dirty = 0;.  }
9290: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
92a0: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
92b0: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
92c0: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
92d0: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
92e0: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
92f0: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
9300: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
9310: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
9320: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
9330: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
9340: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
9350: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
9360: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
9370: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
9380: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
9390: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
93a0: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
93b0: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
93c0: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  * sqlite3pager_r
93d0: 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a  ollback()..    *
93e0: 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74  /.    void *pDat
93f0: 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74  a;.    /* assert
9400: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c  ( pPg->nRef==0 |
9410: 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29  | pPg->pgno==1 )
9420: 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d  ; */.    pData =
9430: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
9440: 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Pg);.    memcpy(
9450: 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50  pData, aData, pP
9460: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
9470: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
9480: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 20  >xDestructor ){ 
9490: 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53   /*** FIX ME:  S
94a0: 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78 52  hould this be xR
94b0: 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20  einit? ***/.    
94c0: 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
94d0: 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50 61  uctor(pData, pPa
94e0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
94f0: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
9500: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
9510: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
9520: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
9530: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
9540: 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
9550: 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
9560: 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65  no, 3);.  }.  re
9570: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
9580: 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73  * Parameter zMas
9590: 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ter is the name 
95a0: 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
95b0: 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67  nal file. A sing
95c0: 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  le journal.** fi
95d0: 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64  le that referred
95e0: 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a   to the master j
95f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
9600: 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64  just been rolled
9610: 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72   back..** This r
9620: 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66  outine checks if
9630: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
9640: 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  to delete the ma
9650: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9660: 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73  e,.** and does s
9670: 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  o if it is..**.*
9680: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
9690: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
96a0: 6e 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ns the names of 
96b0: 61 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  all child journa
96c0: 6c 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69  ls..** To tell i
96d0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
96e0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
96f0: 64 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68  d, check to each
9700: 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64   of the.** child
9710: 72 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69  ren.  If all chi
9720: 6c 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72  ldren are either
9730: 20 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e   missing or do n
9740: 6f 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61  ot refer to.** a
9750: 20 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65   different maste
9760: 72 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  r journal, then 
9770: 74 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72  this master jour
9780: 6e 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74  nal can be delet
9790: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
97a0: 74 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65  t pager_delmaste
97b0: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  r(const char *zM
97c0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
97d0: 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f  ;.  int master_o
97e0: 70 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c  pen = 0;.  OsFil
97f0: 65 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72  e master;.  char
9800: 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   *zMasterJournal
9810: 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74   = 0; /* Content
9820: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
9830: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
9840: 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  4 nMasterJournal
9850: 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  ;       /* Size 
9860: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
9870: 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20  l file */..  /* 
9880: 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20  Open the master 
9890: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63  journal file exc
98a0: 6c 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65  lusively in case
98b0: 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
98c0: 65 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e  ess.  ** is runn
98d0: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
98e0: 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20   also. Not that 
98f0: 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63  it makes too muc
9900: 68 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20  h difference..  
9910: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73  */.  memset(&mas
9920: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d  ter, 0, sizeof(m
9930: 61 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20  aster));.  rc = 
9940: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
9950: 64 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26  dOnly(zMaster, &
9960: 6d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72  master);.  if( r
9970: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
9980: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9990: 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e  t;.  master_open
99a0: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
99b0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
99c0: 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72  master, &nMaster
99d0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20  Journal);.  if( 
99e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
99f0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9a00: 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74  ut;..  if( nMast
9a10: 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20  erJournal>0 ){. 
9a20: 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61     char *zJourna
9a30: 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  l;.    char *zMa
9a40: 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20  sterPtr = 0;..  
9a50: 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e    /* Load the en
9a60: 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72  tire master jour
9a70: 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70  nal file into sp
9a80: 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ace obtained fro
9a90: 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d  m.    ** sqliteM
9aa0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
9ab0: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
9ac0: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
9ad0: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
9ae0: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
9af0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73  qliteMalloc(nMas
9b00: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  terJournal);.   
9b10: 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75   if( !zMasterJou
9b20: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
9b30: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9b40: 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d  .      goto delm
9b50: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  aster_out;.    }
9b60: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9b70: 33 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c  3OsRead(&master,
9b80: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c   zMasterJournal,
9b90: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29   nMasterJournal)
9ba0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
9bb0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
9bc0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
9bd0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d     zJournal = zM
9be0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20  asterJournal;.  
9bf0: 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e    while( (zJourn
9c00: 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al-zMasterJourna
9c10: 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  l)<nMasterJourna
9c20: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  l ){.      if( s
9c30: 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
9c40: 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a  ts(zJournal) ){.
9c50: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
9c60: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
9c70: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
9c80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9c90: 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
9ca0: 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
9cb0: 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
9cc0: 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
9cd0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
9ce0: 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
9cf0: 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
9d00: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
9d10: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
9d20: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f      */.        O
9d30: 73 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20  sFile journal;. 
9d40: 20 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20         int c;.. 
9d50: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a         memset(&j
9d60: 6f 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f  ournal, 0, sizeo
9d70: 66 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20  f(journal));.   
9d80: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9d90: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
9da0: 7a 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e  zJournal, &journ
9db0: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
9dc0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
9dd0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
9de0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
9df0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
9e00: 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74     rc = readMast
9e10: 65 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e  erJournal(&journ
9e20: 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29  al, &zMasterPtr)
9e30: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9e40: 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61  3OsClose(&journa
9e50: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
9e60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9e70: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9e80: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9e90: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
9ea0: 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72    c = zMasterPtr
9eb0: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
9ec0: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
9ed0: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73  r)==0;.        s
9ee0: 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65  qliteFree(zMaste
9ef0: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69  rPtr);.        i
9f00: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
9f10: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
9f20: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
9f30: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
9f40: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
9f50: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
9f60: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9f70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9f80: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
9f90: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
9fa0: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
9fb0: 7d 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73  }.  .  sqlite3Os
9fc0: 44 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b  Delete(zMaster);
9fd0: 0a 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a  ..delmaster_out:
9fe0: 0a 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f  .  if( zMasterJo
9ff0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  urnal ){.    sql
a000: 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a  iteFree(zMasterJ
a010: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
a020: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
a030: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
a040: 73 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b  sClose(&master);
a050: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
a060: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
a070: 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68  every page in th
a080: 65 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69  e cache agree wi
a090: 74 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69  th what is on di
a0a0: 73 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  sk.  In other wo
a0b0: 72 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74  rds,.** reread t
a0c0: 68 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74  he disk to reset
a0d0: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
a0e0: 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54  e cache..**.** T
a0f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a100: 61 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f  alled after a ro
a110: 6c 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20  llback in which 
a120: 73 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74  some of the dirt
a130: 79 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73  y cache.** pages
a140: 20 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20   had never been 
a150: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64  written out to d
a160: 69 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  isk.  We need to
a170: 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a   roll back the.*
a180: 2a 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20  * cache content 
a190: 61 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20  and the easiest 
a1a0: 77 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69  way to do that i
a1b0: 73 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20  s to reread the 
a1c0: 6f 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62  old content.** b
a1d0: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ack from the dis
a1e0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
a1f0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
a200: 63 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  che(Pager *pPage
a210: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
a220: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
a230: 49 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50  ITE_OK;.  for(pP
a240: 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
a250: 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
a260: 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61  extAll){.    cha
a270: 72 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41  r zBuf[SQLITE_MA
a280: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20  X_PAGE_SIZE];.  
a290: 20 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74    if( !pPg->dirt
a2a0: 79 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  y ) continue;.  
a2b0: 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
a2c0: 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
a2d0: 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
a2e0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
a2f0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  k(&pPager->fd, p
a300: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a  Pager->pageSize*
a310: 28 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d  (i64)(pPg->pgno-
a320: 31 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1));.      rc = 
a330: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
a340: 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c  Pager->fd, zBuf,
a350: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a360: 65 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  e);.      TRACE3
a370: 28 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67  ("REFETCH %d pag
a380: 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
a390: 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
a3a0: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
a3b0: 72 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rc ) break;.    
a3c0: 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
a3d0: 7a 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  zBuf, pPg->pgno,
a3e0: 20 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   2);.    }else{.
a3f0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75        memset(zBu
a400: 66 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  f, 0, pPager->pa
a410: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
a420: 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
a430: 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42  ==0 || memcmp(zB
a440: 75 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  uf, PGHDR_TO_DAT
a450: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
a460: 70 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20  pageSize) ){.   
a470: 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
a480: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42  TO_DATA(pPg), zB
a490: 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  uf, pPager->page
a4a0: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Size);.      if(
a4b0: 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
a4c0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
a4d0: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
a4e0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
a4f0: 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
a500: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Size);.      }el
a510: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73  se{.        mems
a520: 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  et(PGHDR_TO_EXTR
a530: 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20  A(pPg, pPager), 
a540: 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72  0, pPager->nExtr
a550: 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  a);.      }.    
a560: 7d 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53  }.    pPg->needS
a570: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ync = 0;.    pPg
a580: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  ->dirty = 0;.#if
a590: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
a5a0: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
a5b0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
a5c0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
a5d0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74  #endif.  }.  ret
a5e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
a5f0: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61   Truncate the ma
a600: 69 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67  in file of the g
a610: 69 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68  iven pager to th
a620: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
a630: 73 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a  s.** indicated..
a640: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
a650: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
a660: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
a670: 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
a680: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
a690: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
a6a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   );.  return sql
a6b0: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
a6c0: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
a6d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
a6e0: 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  4)nPage);.}../*.
a6f0: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
a700: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
a710: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
a720: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
a730: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
a740: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
a750: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
a760: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
a770: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a780: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
a790: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
a7a0: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
a7b0: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
a7c0: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
a7d0: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
a7e0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
a7f0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
a800: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
a810: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
a820: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
a830: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
a840: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
a850: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
a860: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
a870: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
a880: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
a890: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
a8a0: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
a8b0: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
a8c0: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
a8d0: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
a8e0: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
a8f0: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
a900: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
a910: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
a920: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
a930: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
a940: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
a950: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
a960: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
a970: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
a980: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
a990: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
a9a0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a9b0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
a9c0: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
a9d0: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
a9e0: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
a9f0: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
aa00: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
aa10: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
aa20: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
aa30: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
aa40: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
aa50: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
aa60: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
aa70: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
aa80: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
aa90: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
aaa0: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
aab0: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
aac0: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
aad0: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
aae0: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
aaf0: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
ab00: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
ab10: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
ab20: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
ab30: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
ab40: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
ab50: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
ab60: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
ab70: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
ab80: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
ab90: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
aba0: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
abb0: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
abc0: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
abd0: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
abe0: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
abf0: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
ac00: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
ac10: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
ac20: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
ac30: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
ac40: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
ac50: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
ac60: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
ac70: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
ac80: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
ac90: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
aca0: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
acb0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
acc0: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
acd0: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
ace0: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
acf0: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
ad00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
ad10: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
ad20: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
ad30: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
ad40: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
ad50: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
ad60: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
ad70: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
ad80: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
ad90: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
ada0: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
adb0: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
adc0: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
add0: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
ade0: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
adf0: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
ae00: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
ae10: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
ae20: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
ae30: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
ae40: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
ae50: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
ae60: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
ae70: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
ae80: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
ae90: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
aea0: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
aeb0: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
aec0: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
aed0: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
aee0: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
aef0: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
af00: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
af10: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
af20: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
af30: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
af40: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
af50: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
af60: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
af70: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
af80: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
af90: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
afa0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
afb0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
afc0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
afd0: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
afe0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
aff0: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
b000: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
b010: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
b020: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
b030: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
b040: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
b050: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
b060: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
b070: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
b080: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
b090: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
b0a0: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
b0b0: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
b0c0: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
b0d0: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
b0e0: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
b0f0: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
b100: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
b110: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
b120: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
b130: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
b140: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
b150: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
b160: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
b170: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
b180: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
b190: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
b1a0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
b1b0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
b1c0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b1d0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
b1e0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
b1f0: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
b200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
b210: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
b220: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
b230: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b250: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
b260: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
b270: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b280: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
b290: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
b2a0: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b2c0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
b2d0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
b2e0: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
b2f0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
b300: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
b310: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
b320: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
b330: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
b340: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
b350: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
b360: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
b370: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
b380: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
b390: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
b3a0: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
b3b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
b3c0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
b3d0: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
b3e0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
b3f0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
b400: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
b410: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
b420: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
b430: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
b440: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
b450: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
b460: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b470: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
b480: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
b490: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
b4a0: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
b4b0: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
b4c0: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
b4d0: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
b4e0: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
b4f0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
b500: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
b510: 6c 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l(&pPager->jfd, 
b520: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
b530: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
b540: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
b550: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
b560: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
b570: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
b580: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
b590: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
b5a0: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
b5b0: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
b5c0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
b5d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b5e0: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
b5f0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
b600: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
b610: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
b620: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b630: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
b640: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
b650: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
b660: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
b670: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
b680: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
b690: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
b6a0: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
b6b0: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
b6c0: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
b6d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
b6e0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
b6f0: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
b700: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
b710: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
b720: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
b730: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
b740: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
b750: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
b760: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
b770: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
b780: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
b790: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
b7a0: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
b7b0: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
b7c0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
b7d0: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
b7e0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
b7f0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
b800: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
b810: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b820: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
b830: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
b840: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
b850: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b860: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
b870: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
b880: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
b890: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
b8a0: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
b8b0: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
b8c0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
b8d0: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
b8e0: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
b8f0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
b900: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
b910: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
b920: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
b930: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
b940: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
b950: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
b960: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
b970: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
b980: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
b990: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
b9a0: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
b9b0: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
b9c0: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
b9d0: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
b9e0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
b9f0: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
ba00: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
ba10: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
ba20: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
ba30: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
ba40: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
ba50: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
ba60: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
ba70: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
ba80: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
ba90: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
baa0: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
bab0: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
bac0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
bad0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
bae0: 45 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50  E && .        pP
baf0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bb00: 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  ==JOURNAL_HDR_SZ
bb10: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
bb20: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
bb30: 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20  ->origDbSize==0 
bb40: 7c 7c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  || pPager->origD
bb50: 62 53 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20  bSize==mxPg );. 
bb60: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
bb70: 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
bb80: 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66   mxPg);.      if
bb90: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bba0: 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  ){.        goto 
bbb0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
bbc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
bbd0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50  er->dbSize = mxP
bbe0: 67 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  g;.    }..    /*
bbf0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
bc00: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
bc10: 2c 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  , JOURNAL_HDR_SZ
bc20: 28 70 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20  (pPager)); */.  
bc30: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bc40: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70  _OK ) goto end_p
bc50: 6c 61 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20  layback;.  .    
bc60: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
bc70: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
bc80: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
bc90: 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
bca0: 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
bcb0: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
bcc0: 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
bcd0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
bce0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
bcf0: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
bd00: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
bd10: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bd20: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  K ){.        if(
bd30: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
bd40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
bd50: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bd60: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bd70: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
bd80: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
bd90: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
bda0: 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
bdb0: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
bdc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
bdd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
bde0: 20 50 61 67 65 73 20 74 68 61 74 20 68 61 76 65   Pages that have
bdf0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
be00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74   the journal but
be10: 20 6e 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20   never synced.  
be20: 2a 2a 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73  ** where not res
be30: 74 6f 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f  tored by the loo
be40: 70 20 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76  p above.  We hav
be50: 65 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f  e to restore tho
be60: 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79  se.  ** pages by
be70: 20 72 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61   reading them ba
be80: 63 6b 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ck from the orig
be90: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20  inal database.. 
bea0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63   */.  assert( rc
beb0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
bec0: 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
bed0: 63 68 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e  che(pPager);..en
bee0: 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66  d_playback:.  if
bef0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bf00: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
bf10: 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
bf20: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
bf30: 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20   zMaster ){.    
bf40: 2f 2a 20 49 66 20 74 68 65 72 65 20 77 61 73 20  /* If there was 
bf50: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
bf60: 20 61 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e   and this routin
bf70: 65 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72  e will return tr
bf80: 75 65 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69  ue,.    ** see i
bf90: 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
bfa0: 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
bfb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20  aster journal.. 
bfc0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
bfd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bfe0: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
bff0: 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65  delmaster(zMaste
c000: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
c010: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
c020: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
c030: 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a   Pager.sectorSiz
c040: 65 20 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68  e variable may h
c050: 61 76 65 20 62 65 65 6e 20 75 70 64 61 74 65 64  ave been updated
c060: 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20   while rolling. 
c070: 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e   ** back a journ
c080: 61 6c 20 63 72 65 61 74 65 64 20 62 79 20 61 20  al created by a 
c090: 70 72 6f 63 65 73 73 20 77 69 74 68 20 61 20 64  process with a d
c0a0: 69 66 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53  ifferent PAGER_S
c0b0: 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20  ECTOR_SIZE.  ** 
c0c0: 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
c0d0: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
c0e0: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
c0f0: 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50  ocess..  */.  pP
c100: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
c110: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
c120: 53 49 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72  SIZE;.  return r
c130: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  c;.}../*.** Play
c140: 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
c150: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  nt journal..**.*
c160: 2a 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61  * This is simila
c170: 72 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  r to playing bac
c180: 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  k the transactio
c190: 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69  n journal but wi
c1a0: 74 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72  th.** a few extr
c1b0: 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20  a twists..**.** 
c1c0: 20 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62     (1)  The numb
c1d0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  er of pages in t
c1e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c1f0: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
c200: 0a 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20  .**         the 
c210: 73 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f  statement is sto
c220: 72 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73  red in pPager->s
c230: 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20  tmtSize, not in 
c240: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a  the.**         j
c250: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65  ournal file itse
c260: 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  lf..**.**    (2)
c270: 20 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f    In addition to
c280: 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
c290: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
c2a0: 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20  nal, also.**    
c2b0: 20 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c       playback al
c2c0: 6c 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74  l pages of the t
c2d0: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
c2e0: 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20  al beginning.** 
c2f0: 20 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65          at offse
c300: 74 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  t pPager->stmtJS
c310: 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ize..*/.static i
c320: 6e 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c  nt pager_stmt_pl
c330: 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
c340: 61 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a  ager){.  i64 szJ
c350: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c360: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
c370: 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f   full journal */
c380: 0a 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20  .  i64 hdrOff;. 
c390: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
c3a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
c3b0: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a  ber of Records *
c3c0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
c3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c3e0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
c3f0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a    int rc;..  szJ
c400: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
c410: 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e  alOff;.#ifndef N
c420: 44 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69  DEBUG .  {.    i
c430: 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72  64 os_szJ;.    r
c440: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
c450: 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a  eSize(&pPager->j
c460: 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20  fd, &os_szJ);.  
c470: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c480: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
c490: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a  .    assert( szJ
c4a0: 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a  ==os_szJ );.  }.
c4b0: 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74  #endif..  /* Set
c4c0: 20 68 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68   hdrOff to be th
c4d0: 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
c4e0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
c4f0: 61 64 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a  ader written.  *
c500: 2a 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  * this statement
c510: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72   transaction, or
c520: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
c530: 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e  file if no journ
c540: 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77  al.  ** header w
c550: 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f  as written..  */
c560: 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67  .  hdrOff = pPag
c570: 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a  er->stmtHdrOff;.
c580: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
c590: 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68  ->fullSync || !h
c5a0: 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21  drOff );.  if( !
c5b0: 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64  hdrOff ){.    hd
c5c0: 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a  rOff = szJ;.  }.
c5d0: 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65    .  /* Truncate
c5e0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61   the database ba
c5f0: 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ck to its origin
c600: 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20  al size..  */.  
c610: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
c620: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
c630: 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  VE ){.    rc = p
c640: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
c650: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
c660: 6d 74 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70  mtSize);.  }.  p
c670: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
c680: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
c690: 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  ;..  /* Figure o
c6a0: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
c6b0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73  rds are in the s
c6c0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c6d0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
c6e0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
c6f0: 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  se && pPager->jo
c700: 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73  urnalOpen );.  s
c710: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
c720: 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
c730: 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72 2d    nRec = pPager-
c740: 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20  >stmtNRec;.  .  
c750: 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
c760: 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
c770: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
c780: 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
c790: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
c7a0: 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20  ase file.  Note 
c7b0: 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
c7c0: 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73  nt journal omits
c7d0: 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a   checksums from.
c7e0: 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72 64    ** each record
c7f0: 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61 69   since power-fai
c800: 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69 73  lure recovery is
c810: 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20 74   not important t
c820: 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a  o statement.  **
c830: 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a   journals..  */.
c840: 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20    for(i=nRec-1; 
c850: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
c860: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
c870: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
c880: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  ger, &pPager->st
c890: 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  fd, 0);.    asse
c8a0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
c8b0: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
c8c0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
c8d0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
c8e0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
c8f0: 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70   Now roll some p
c900: 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20 74  ages back from t
c910: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
c920: 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74  ournal. Pager.st
c930: 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73  mtJSize.  ** was
c940: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c950: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
c960: 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e  en this statemen
c970: 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20 73  t was started, s
c980: 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69 6e  o.  ** everythin
c990: 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65 65  g after that nee
c9a0: 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ds to be rolled 
c9b0: 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e 74  back, either int
c9c0: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  o the.  ** datab
c9d0: 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20  ase, the memory 
c9e0: 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a  cache, or both..
c9f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20    **.  ** If it 
ca00: 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65  is not zero, the
ca10: 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72 4f  n Pager.stmtHdrO
ca20: 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65 74  ff is the offset
ca30: 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20 20   to the start.  
ca40: 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
ca50: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
ca60: 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74 68  ritten during th
ca70: 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  is statement tra
ca80: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
ca90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
caa0: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
cab0: 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53  , pPager->stmtJS
cac0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
cad0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
cae0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
caf0: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
cb00: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
cb10: 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
cb20: 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  JSize;.  pPager-
cb30: 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50 61  >cksumInit = pPa
cb40: 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a  ger->stmtCksum;.
cb50: 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e 41    assert( JOURNA
cb60: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
cb70: 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  <(pPager->pageSi
cb80: 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c 65  ze+8) );.  while
cb90: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
cba0: 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d  lOff <= (hdrOff-
cbb0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
cbc0: 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63 20  e+8)) ){.    rc 
cbd0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
cbe0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
cbf0: 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  , &pPager->jfd, 
cc00: 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  1);.    assert( 
cc10: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
cc20: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
cc30: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
cc40: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
cc50: 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  k;.  }..  while(
cc60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cc70: 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20  Off < szJ ){.   
cc80: 20 75 33 32 20 6e 52 65 63 3b 0a 20 20 20 20 75   u32 nRec;.    u
cc90: 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63  32 dummy;.    rc
cca0: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
ccb0: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
ccc0: 6e 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20  nRec, &dummy);. 
ccd0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
cce0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
ccf0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
cd00: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67  _DONE );.      g
cd10: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
cd20: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  yback;.    }.   
cd30: 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a   if( nRec==0 ){.
cd40: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a        nRec = (sz
cd50: 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
cd60: 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
cd70: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
cd80: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
cd90: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20  nRec-1; i>=0 && 
cda0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cdb0: 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a  ff < szJ; i--){.
cdc0: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
cdd0: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
cde0: 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
cdf0: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
ce00: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
ce10: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
ce20: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ce30: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
ce40: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
ce50: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
ce60: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
ce70: 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74  = szJ;.  .end_st
ce80: 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  mt_playback:.  i
ce90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
cea0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ceb0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
cec0: 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20  _ERR_CORRUPT;.  
ced0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
cee0: 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d  RRUPT;  /* bkpt-
cef0: 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 65 6c  CORRUPT */.  }el
cf00: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
cf10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
cf20: 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72  ;.    /* pager_r
cf30: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
cf40: 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  er); */.  }.  re
cf50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cf60: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
cf70: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
cf80: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
cf90: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
cfa0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cfb0: 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73  pager_set_caches
cfc0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
cfd0: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
cfe0: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
cff0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
d000: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
d010: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
d020: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
d030: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
d040: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
d050: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
d060: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
d070: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
d080: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
d090: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
d0a0: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
d0b0: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
d0c0: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
d0d0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
d0e0: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
d0f0: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
d100: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
d110: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
d120: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
d130: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
d140: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d150: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
d160: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
d170: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
d180: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
d190: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
d1a0: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d1b0: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d1d0: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
d1e0: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
d1f0: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
d200: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
d210: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
d220: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
d230: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
d240: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
d250: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
d260: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
d270: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
d280: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
d290: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
d2a0: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
d2b0: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
d2c0: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
d2d0: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
d2e0: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
d2f0: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
d300: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
d310: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
d320: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
d330: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
d340: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d350: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
d360: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
d370: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
d380: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
d390: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d3a0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d3b0: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
d3c0: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
d3d0: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
d3e0: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
d3f0: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
d400: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
d410: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
d420: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
d430: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
d440: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
d450: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
d460: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
d470: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
d480: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
d490: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
d4b0: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
d4c0: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
d4d0: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
d4e0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
d4f0: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
d500: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
d510: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
d520: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
d530: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
d540: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d550: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
d560: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  S.void sqlite3pa
d570: 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c  ger_set_safety_l
d580: 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
d590: 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a  er, int level){.
d5a0: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
d5b0: 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
d5c0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
d5d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
d5e0: 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
d5f0: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
d600: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
d610: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
d620: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
d630: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
d640: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d650: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
d660: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
d670: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
d680: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
d690: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
d6a0: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
d6b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d6c0: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
d6d0: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
d6e0: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20   only.  .*/.int 
d6f0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
d700: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  _count = 0;../*.
d710: 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
d720: 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ary file.  Write
d730: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d740: 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65   file into zFile
d750: 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20  .** (zFile must 
d760: 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49  be at least SQLI
d770: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
d780: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57   bytes long.)  W
d790: 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  rite.** the file
d7a0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
d7b0: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
d7c0: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
d7d0: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
d7e0: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
d7f0: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
d800: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
d810: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
d820: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
d830: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
d840: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
d850: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
d860: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
d870: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
d880: 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63  le *fd){.  int c
d890: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
d8a0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
d8b0: 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
d8c0: 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
d8d0: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
d8e0: 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  only */.  do{.  
d8f0: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
d900: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
d910: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
d920: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
d930: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
d940: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
d950: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
d960: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
d970: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
d980: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
d990: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
d9a0: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
d9b0: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
d9c0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
d9d0: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
d9e0: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
d9f0: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
da00: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
da10: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
da20: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
da30: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
da40: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
da50: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
da60: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
da70: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
da80: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
da90: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
daa0: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
dab0: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
dac0: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
dad0: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
dae0: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
daf0: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
db00: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
db10: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
db20: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
db30: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
db40: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
db50: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
db60: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
db70: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
db80: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
db90: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
dba0: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
dbb0: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
dbc0: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
dbd0: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
dbe0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
dbf0: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
dc00: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  te3pager_open(. 
dc10: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
dc20: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
dc30: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
dc40: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
dc50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
dc60: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
dc70: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
dc80: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
dc90: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dcb0: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
dcc0: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
dcd0: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
dce0: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
dcf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
dd00: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
dd10: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
dd20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
dd30: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
dd40: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
dd50: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c  nameLen;.  OsFil
dd60: 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  e fd;.  int rc =
dd70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
dd80: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
dd90: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
dda0: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
ddb0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
ddc0: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
ddd0: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
dde0: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
ddf0: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
de00: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
de10: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
de20: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
de30: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
de40: 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50  E_SIZE];..  *ppP
de50: 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  ager = 0;.  mems
de60: 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f  et(&fd, 0, sizeo
de70: 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71  f(fd));.  if( sq
de80: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
de90: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
dea0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
deb0: 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e    }.  if( zFilen
dec0: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
ded0: 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  [0] ){.#ifndef S
dee0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
def0: 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
df00: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
df10: 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
df20: 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
df30: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
df40: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
df50: 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63  up("");.      rc
df60: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
df70: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
df80: 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c     {.      zFull
df90: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
dfa0: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
dfb0: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
dfc0: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
dfd0: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
dfe0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
dff0: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
e000: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
e010: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
e020: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
e030: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
e040: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
e050: 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  p(zTemp, &fd);. 
e060: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
e070: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
e080: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e090: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e0a0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
e0b0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e0c0: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
e0d0: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
e0e0: 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c 50   }.  if( !zFullP
e0f0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73  athname ){.    s
e100: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
e110: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
e120: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e130: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e140: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
e150: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
e160: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e170: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e180: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e190: 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73   }.  nameLen = s
e1a0: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
e1b0: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  ame);.  pPager =
e1c0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
e1d0: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
e1e0: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
e1f0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  );.  if( pPager=
e200: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
e210: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
e220: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
e230: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e240: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e250: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41  NOMEM;.  }.  TRA
e260: 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
e270: 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
e280: 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  (fd), zFullPathn
e290: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ame);.  pPager->
e2a0: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
e2b0: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
e2c0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e2d0: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
e2e0: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
e2f0: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
e300: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
e310: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
e320: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
e330: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
e340: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
e350: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
e360: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e370: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
e380: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  );.  for(i=nameL
e390: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
e3a0: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
e3b0: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
e3c0: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
e3d0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
e3e0: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
e3f0: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
e400: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
e410: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
e420: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e430: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
e440: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
e450: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
e460: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
e470: 3d 20 66 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49  = fd;.#if OS_UNI
e480: 58 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 2e 70  X.  pPager->fd.p
e490: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
e4a0: 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
e4b0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
e4c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ;.  pPager->useJ
e4d0: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
e4e0: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
e4f0: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
e500: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
e510: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
e520: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
e530: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e540: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
e550: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
e560: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  0;.  pPager->dbS
e570: 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
e580: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e590: 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
e5a0: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
e5b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
e5c0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e5d0: 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  stmtJSize = 0;. 
e5e0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
e5f0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d   0;.  pPager->nM
e600: 61 78 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  axPage = 0;.  pP
e610: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
e620: 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  00;.  pPager->st
e630: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
e640: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
e650: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
e660: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
e670: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
e680: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
e690: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
e6a0: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
e6b0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
e6c0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
e6d0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
e6e0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
e6f0: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
e700: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
e710: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
e720: 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
e730: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
e740: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
e750: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
e760: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
e770: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
e780: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
e790: 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50  NT(nExtra);.  pP
e7a0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
e7b0: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
e7c0: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
e7d0: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
e7e0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
e7f0: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
e800: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
e810: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
e820: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
e830: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e840: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
e850: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
e860: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
e870: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
e880: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
e890: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
e8a0: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
e8b0: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
e8c0: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
e8d0: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
e8e0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
e8f0: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
e900: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
e910: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
e920: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
e930: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
e940: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
e950: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
e960: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
e970: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
e980: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
e990: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
e9a0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
e9b0: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
e9c0: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
e9d0: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
e9e0: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
e9f0: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
ea00: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
ea10: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
ea20: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
ea30: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
ea40: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
ea50: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ea60: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
ea70: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
ea80: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
ea90: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
eaa0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
eab0: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
eac0: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
ead0: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
eae0: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
eaf0: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
eb00: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
eb10: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
eb20: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
eb30: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
eb40: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
eb50: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
eb60: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
eb70: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
eb80: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
eb90: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
eba0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
ebb0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
ebc0: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
ebd0: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
ebe0: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
ebf0: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
ec00: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
ec10: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
ec20: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
ec30: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
ec40: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
ec50: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
ec60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ec70: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
ec80: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
ec90: 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
eca0: 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
ecb0: 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
ecc0: 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
ecd0: 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
ece0: 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
ecf0: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
ed00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
ed10: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a  ager_set_pagesiz
ed20: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
ed30: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
ed40: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
ed50: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
ed60: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
ed70: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
ed80: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
ed90: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
eda0: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
edb0: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
edc0: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
edd0: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
ede0: 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
edf0: 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
ee00: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
ee10: 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
ee20: 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
ee30: 69 6e 74 73 20 74 6f 2e 20 20 4e 6f 20 65 72 72  ints to.  No err
ee40: 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  or checking is d
ee50: 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  one..*/.void sql
ee60: 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66  ite3pager_read_f
ee70: 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
ee80: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
ee90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
eea0: 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28  Dest){.  memset(
eeb0: 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
eec0: 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a  if( MEMDB==0 ){.
eed0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
eee0: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  k(&pPager->fd, 0
eef0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
ef00: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
ef10: 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d  , pDest, N);.  }
ef20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
ef30: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
ef40: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
ef50: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
ef60: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
ef70: 50 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Pager..*/.int sq
ef80: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
ef90: 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
efa0: 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  er){.  i64 n;.  
efb0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
efc0: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
efd0: 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
efe0: 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
eff0: 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20  r->dbSize;.  }. 
f000: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
f010: 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
f020: 66 64 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f  fd, &n)!=SQLITE_
f030: 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
f040: 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
f050: 45 52 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20  ER_ERR_DISK;.   
f060: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
f070: 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50   if( n>0 && n<pP
f080: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
f090: 7b 0a 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 7d  {.    n = 1;.  }
f0a0: 65 6c 73 65 7b 0a 20 20 20 20 6e 20 2f 3d 20 70  else{.    n /= p
f0b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
f0c0: 0a 20 20 7d 0a 20 20 69 66 28 20 21 4d 45 4d 44  .  }.  if( !MEMD
f0d0: 42 20 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f  B && n==PENDING_
f0e0: 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
f0f0: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 2b 2b  eSize ){.    n++
f100: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
f110: 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
f120: 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _UNLOCK ){.    p
f130: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
f140: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
f150: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  n;.}../*.** Forw
f160: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
f170: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
f180: 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
f190: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  );.../*.** Unlin
f1a0: 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
f1b0: 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
f1c0: 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
f1d0: 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
f1e0: 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
f1f0: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
f200: 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
f210: 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
f220: 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
f230: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  he.** sqlite3pag
f240: 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f  er_movepage() ro
f250: 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20  utine can leave 
f260: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  a page in the .*
f270: 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65  * pNextFree/pPre
f280: 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20  vFree list that 
f290: 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66  is not a part of
f2a0: 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e   any hash-chain.
f2b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f2c0: 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
f2d0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
f2e0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
f2f0: 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
f300: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
f310: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 7a  page number is z
f320: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
f330: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 61 6e  age is not in an
f340: 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 2a 2f  y hash chain. */
f350: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
f360: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
f370: 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
f380: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
f390: 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
f3a0: 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
f3b0: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
f3c0: 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
f3d0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
f3e0: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
f3f0: 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  gno)]!=pPg );.  
f400: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
f410: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
f420: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
f430: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
f440: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
f450: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
f460: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
f470: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
f480: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
f490: 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
f4a0: 48 61 73 68 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  Hash;.  }..  pPg
f4b0: 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
f4c0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
f4d0: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
f4e0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
f4f0: 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
f500: 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
f510: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
f520: 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
f530: 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
f540: 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
f550: 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
f560: 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
f570: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
f580: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
f590: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
f5a0: 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
f5b0: 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
f5c0: 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
f5d0: 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
f5e0: 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
f5f0: 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
f600: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
f610: 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
f620: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
f630: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
f640: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
f650: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
f660: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
f670: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
f680: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
f690: 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
f6a0: 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
f6b0: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
f6c0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
f6d0: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
f6e0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
f6f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
f700: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
f710: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
f720: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
f730: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
f740: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
f750: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
f760: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
f770: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
f780: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
f790: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
f7a0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
f7b0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
f7c0: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
f7d0: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
f7e0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
f7f0: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
f800: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
f810: 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
f820: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
f830: 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
f840: 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
f850: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
f860: 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f  _OMIT_MEMORYDB./
f870: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f880: 65 20 69 73 20 75 73 65 64 20 74 6f 20 74 72 75  e is used to tru
f890: 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ncate an in-memo
f8a0: 72 79 20 64 61 74 61 62 61 73 65 2e 20 20 44 65  ry database.  De
f8b0: 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65  lete.** all page
f8c0: 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20  s whose pgno is 
f8d0: 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
f8e0: 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69  er->dbSize and i
f8f0: 73 20 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a  s unreferenced..
f900: 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
f910: 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
f920: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
f930: 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74  re zeroed..*/.st
f940: 61 74 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79  atic void memory
f950: 54 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  Truncate(Pager *
f960: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
f970: 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a   *pPg;.  PgHdr *
f980: 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53  *ppPg;.  int dbS
f990: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
f9a0: 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20  Size;..  ppPg = 
f9b0: 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
f9c0: 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
f9d0: 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
f9e0: 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
f9f0: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
fa00: 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
fa10: 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
fa20: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
fa30: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
fa40: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
fa50: 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
fa60: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
fa70: 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
fa80: 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
fa90: 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
faa0: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
fab0: 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28       unlinkPage(
fac0: 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pPg);.      sqli
fad0: 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20  teFree(pPg);.   
fae0: 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
faf0: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  --;.    }.  }.}.
fb00: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d 65  #else.#define me
fb10: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 29 0a  moryTruncate(p).
fb20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
fb30: 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
fb40: 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
fb50: 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
fb60: 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
fb70: 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
fb80: 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
fb90: 65 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c  e.  Repeat until
fba0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
fbb0: 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
fbc0: 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
fbd0: 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
fbe0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
fbf0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
fc00: 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
fc10: 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
fc20: 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
fc30: 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
fc40: 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
fc50: 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
fc60: 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
fc70: 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
fc80: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
fc90: 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
fca0: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
fcb0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
fcc0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
fcd0: 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
fce0: 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
fcf0: 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  SIVE_LOCK );.  i
fd00: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
fd10: 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
fd20: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
fd30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
fd40: 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
fd50: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
fd60: 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
fd70: 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
fd80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
fd90: 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b   && sqlite3Invok
fda0: 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50 61  eBusyHandler(pPa
fdb0: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
fdc0: 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  r) );.    if( rc
fdd0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
fde0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
fdf0: 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a 20  te = locktype;. 
fe00: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
fe10: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
fe20: 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65  runcate the file
fe30: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
fe40: 66 20 70 61 67 65 73 20 73 70 65 63 69 66 69 65  f pages specifie
fe50: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
fe60: 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
fe70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
fe80: 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e  gno nPage){.  in
fe90: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 70  t rc;.  sqlite3p
fea0: 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
feb0: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
fec0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
fed0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
fee0: 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
fef0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
ff00: 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 61  c;.  }.  if( nPa
ff10: 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29 70 50  ge>=(unsigned)pP
ff20: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
ff30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
ff40: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
ff50: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
ff60: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
ff70: 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  age;.    memoryT
ff80: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
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 72 63 20  TE_OK;.  }.  rc 
ffb0: 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
ffc0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
ffd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ffe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
fff0: 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78  ..  /* Get an ex
10000 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
10010 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
10020 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20  ore truncating. 
10030 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
10040 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
10050 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
10060 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
10070 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
10090 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
100a0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
100b0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
100c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
100d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
100e0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
100f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10100 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65  .** Shutdown the
10110 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46 72   page cache.  Fr
10120 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e  ee all memory an
10130 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  d close all file
10140 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72  s..**.** If a tr
10150 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e  ansaction was in
10160 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20 74   progress when t
10170 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
10180 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74  alled, that.** t
10190 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
101a0 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20  lled back.  All 
101b0 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
101c0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
101d0 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20 6d  d.** and their m
101e0 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e 20  emory is freed. 
101f0 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
10200 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f 63  use a page assoc
10210 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
10220 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61 66  is page cache af
10230 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
10240 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c  n returns will l
10250 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20  ikely.** result 
10260 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a  in a coredump..*
10270 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
10280 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72 20 2a  er_close(Pager *
10290 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
102a0 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
102b0 20 73 77 69 74 63 68 28 20 70 50 61 67 65 72 2d   switch( pPager-
102c0 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20 63 61  >state ){.    ca
102d0 73 65 20 50 41 47 45 52 5f 52 45 53 45 52 56 45  se PAGER_RESERVE
102e0 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  D:.    case PAGE
102f0 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20 20 63  R_SYNCED: .    c
10300 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ase PAGER_EXCLUS
10310 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  IVE: {.      /* 
10320 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f  We ignore any IO
10330 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f 63 63   errors that occ
10340 75 72 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  ur during the ro
10350 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20  llback.      ** 
10360 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69  operation. So di
10370 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72 20 73  sable IO error s
10380 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61  imulation so tha
10390 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20 20 20  t testing.      
103a0 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61  ** works more ea
103b0 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 23  sily..      */.#
103c0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
103d0 45 5f 54 45 53 54 29 20 26 26 20 28 64 65 66 69  E_TEST) && (defi
103e0 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20  ned(OS_UNIX) || 
103f0 64 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29  defined(OS_WIN))
10400 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20 69 6e  .      extern in
10410 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
10420 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20 20  or_pending;.    
10430 20 20 69 6e 74 20 69 6f 65 72 72 5f 63 6e 74 20    int ioerr_cnt 
10440 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
10450 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 20 20  or_pending;.    
10460 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
10470 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
10480 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 73 71  .#endif.      sq
10490 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
104a0 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 23 69 66  ack(pPager);.#if
104b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
104c0 54 45 53 54 29 20 26 26 20 28 64 65 66 69 6e 65  TEST) && (define
104d0 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64 65  d(OS_UNIX) || de
104e0 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a 20  fined(OS_WIN)). 
104f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f       sqlite3_io_
10500 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20  error_pending = 
10510 69 6f 65 72 72 5f 63 6e 74 3b 0a 23 65 6e 64 69  ioerr_cnt;.#endi
10520 66 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d  f.      if( !MEM
10530 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  DB ){.        sq
10540 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
10550 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
10560 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  CK);.      }.   
10570 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10580 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 70 50  r->errMask || pP
10590 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
105a0 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  n==0 );.      br
105b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
105c0 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ase PAGER_SHARED
105d0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d  : {.      if( !M
105e0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
105f0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
10600 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
10610 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
10620 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
10630 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
10640 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
10650 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
10660 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
10670 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
10680 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
10690 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20  pNext){.#ifndef 
106a0 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 4d  NDEBUG.    if( M
106b0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
106c0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
106d0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
106e0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
106f0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
10700 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
10710 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
10720 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
10730 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
10740 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
10750 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
10760 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
10770 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
10780 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
10790 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  }.  TRACE2("CLOS
107a0 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
107b0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61 73 73  (pPager));.  ass
107c0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72  ert( pPager->err
107d0 4d 61 73 6b 20 7c 7c 20 28 70 50 61 67 65 72 2d  Mask || (pPager-
107e0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
107f0 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  && pPager->stmtO
10800 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28  pen==0) );.  if(
10810 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10820 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
10830 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
10840 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20  er->jfd);.  }.  
10850 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
10860 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->aInJournal);.
10870 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10880 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
10890 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
108a0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d  ager->stfd);.  }
108b0 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
108c0 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
108d0 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
108e0 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
108f0 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
10900 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
10910 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
10920 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
10930 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
10940 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
10950 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74   }.  */..  sqlit
10960 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
10970 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
10980 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
10990 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
109a0 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
109b0 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
109c0 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  gno sqlite3pager
109d0 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64  _pagenumber(void
109e0 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
109f0 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50  r *p = DATA_TO_P
10a00 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
10a10 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
10a20 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
10a30 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
10a40 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
10a50 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
10a60 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
10a70 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
10a80 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
10a90 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
10aa0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
10ab0 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
10ac0 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
10ad0 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
10ae0 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
10af0 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
10b00 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
10b10 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
10b20 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
10b30 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
10b40 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
10b50 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
10b60 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
10b70 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
10b80 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
10b90 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
10ba0 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
10bb0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
10bc0 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
10bd0 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
10be0 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
10bf0 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
10c00 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
10c10 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
10c20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
10c30 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  Pg==pPg->pPager-
10c40 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
10c50 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20  .      PgHdr *p 
10c60 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10c70 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
10c80 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
10c90 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
10ca0 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67  ree; }.      pPg
10cb0 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
10cc0 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
10cd0 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
10ce0 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
10cf0 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
10d00 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
10d10 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10d20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10d30 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
10d40 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
10d50 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ree;.    }.    i
10d60 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
10d70 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
10d80 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
10d90 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
10da0 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  vFree;.    }else
10db0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
10dc0 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
10dd0 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
10de0 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
10df0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
10e00 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
10e10 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
10e20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
10e30 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
10e40 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
10e50 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
10e60 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
10e70 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
10e80 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
10e90 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
10ea0 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
10eb0 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
10ec0 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
10ed0 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
10ee0 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
10ef0 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
10f00 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
10f10 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
10f20 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
10f30 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
10f40 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
10f50 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
10f60 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
10f70 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
10f80 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10f90 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  _ref(void *pData
10fa0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
10fb0 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
10fc0 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72  pData);.  page_r
10fd0 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
10fe0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10ff0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
11000 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
11010 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
11020 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
11030 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
11040 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
11050 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
11060 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
11070 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
11080 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
11090 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
110a0 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
110b0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
110c0 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
110d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
110e0 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
110f0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
11100 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
11110 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
11120 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
11130 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
11140 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
11150 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
11160 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
11170 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
11180 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
11190 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
111a0 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
111b0 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
111c0 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
111d0 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
111e0 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
111f0 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
11200 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
11210 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
11220 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
11230 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
11240 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
11250 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
11260 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
11270 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
11280 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
11290 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
112a0 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
112b0 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
112c0 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
112d0 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
112e0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
112f0 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
11300 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
11310 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
11320 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
11330 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
11340 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
11350 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
11360 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
11370 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f  ilure, so sync o
11380 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ccurs..**.** Thi
11390 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
113a0 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
113b0 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
113c0 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
113d0 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
113e0 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
113f0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
11400 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11410 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
11420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
11430 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
11440 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
11450 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
11460 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
11470 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
11480 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
11490 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
114a0 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
114b0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
114c0 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
114d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
114e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
114f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11500 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   );.      /* ass
11510 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
11520 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
11530 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
11540 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
11550 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
11560 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
11570 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
11580 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
11590 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
115a0 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
115b0 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
115c0 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
115d0 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
115e0 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
115f0 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
11600 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
11610 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
11620 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
11630 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
11640 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
11650 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  jSz;.        rc 
11660 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
11670 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
11680 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20  , &jSz);.       
11690 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
116a0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
116b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
116c0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20  journalOff==jSz 
116d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
116e0 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
116f0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
11700 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
11710 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11720 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
11730 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
11740 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
11750 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
11760 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
11770 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
11780 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
11790 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
117a0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
117b0 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
117c0 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
117d0 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
117e0 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20  e for rollback. 
117f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11800 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
11810 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
11820 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59        TRACE2("SY
11830 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
11840 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
11850 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
11860 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
11870 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
11880 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
11890 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
118a0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
118b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
118c0 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
118d0 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
118e0 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
118f0 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
11900 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
11910 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
11920 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52  >jfd, pPager->nR
11930 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
11940 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
11950 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
11960 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
11970 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
11980 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20  urnalOff);.     
11990 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28   }.      TRACE2(
119a0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
119b0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
119c0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
119d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
119e0 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
119f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11a00 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
11a10 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
11a20 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
11a30 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
11a40 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
11a50 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
11a60 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
11a70 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
11a80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
11a90 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
11aa0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
11ab0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
11ac0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
11ad0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
11ae0 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
11af0 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
11b00 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
11b10 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
11b20 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
11b30 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
11b40 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
11b50 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
11b60 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
11b70 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
11b80 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
11b90 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
11ba0 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
11bb0 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
11bc0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
11bd0 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
11be0 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
11bf0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11c00 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
11c10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
11c20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
11c30 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
11c40 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
11c50 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
11c60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
11c70 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
11c80 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
11c90 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
11ca0 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
11cb0 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
11cc0 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
11cd0 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
11ce0 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
11cf0 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
11d00 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
11d10 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
11d20 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
11d30 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
11d40 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
11d50 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
11d60 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
11d70 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
11d80 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
11d90 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
11da0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
11db0 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
11dc0 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
11dd0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
11de0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
11df0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
11e00 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
11e10 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
11e20 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
11e30 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
11e40 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
11e50 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
11e60 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
11e70 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
11e80 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
11e90 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
11ea0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
11eb0 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
11ec0 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
11ed0 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
11ee0 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
11ef0 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
11f00 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
11f10 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
11f20 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
11f30 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
11f40 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
11f50 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
11f60 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
11f70 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
11f80 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
11f90 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
11fa0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
11fb0 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
11fc0 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
11fd0 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
11fe0 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
11ff0 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
12000 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
12010 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
12020 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
12030 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
12040 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
12050 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
12060 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
12070 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
12080 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
12090 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
120a0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
120b0 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
120c0 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
120d0 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
120e0 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
120f0 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
12100 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
12110 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
12120 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
12130 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
12140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12150 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12160 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69   }..  while( pLi
12170 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
12180 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
12190 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
121a0 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
121b0 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
121c0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
121d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 2f 2a 20  geSize);.    /* 
121e0 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
121f0 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
12200 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
12210 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
12220 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
12230 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
12240 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
12250 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
12260 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
12270 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
12280 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
12290 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
122a0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
122b0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
122c0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
122d0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
122e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
122f0 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
12300 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
12310 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
12320 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
12330 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
12340 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52  no, 6);.      TR
12350 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70  ACE3("STORE %d p
12360 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
12370 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
12380 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
12390 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
123a0 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
123b0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
123c0 4c 69 73 74 29 2c 20 70 50 61 67 65 72 2d 3e 70  List), pPager->p
123d0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
123e0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
123f0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
12400 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
12410 20 30 29 3b 0a 20 20 20 20 20 20 54 45 53 54 5f   0);.      TEST_
12420 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 57 72  INCR(pPager->nWr
12430 69 74 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  ite);.    }.#ifn
12440 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
12450 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
12460 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
12470 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
12480 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
12490 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
124a0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
124b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
124c0 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
124d0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
124e0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
124f0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
12500 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
12510 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
12520 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
12530 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
12540 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
12550 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
12560 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69 72 74  llect every dirt
12570 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69  y page into a di
12580 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20  rty list and.** 
12590 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
125a0 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20   to the head of 
125b0 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20  that list.  All 
125c0 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c  pages are.** col
125d0 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66 20 74  lected even if t
125e0 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e  hey are still in
125f0 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   use..*/.static 
12600 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74  PgHdr *pager_get
12610 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
12620 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
12630 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c  .  PgHdr *p, *pL
12640 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30  ist;.  pList = 0
12650 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72  ;.  for(p=pPager
12660 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e  ->pAll; p; p=p->
12670 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69  pNextAll){.    i
12680 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20  f( p->dirty ){. 
12690 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d       p->pDirty =
126a0 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c   pList;.      pL
126b0 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ist = p;.    }. 
126c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73   }.  return pLis
126d0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
126e0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72 65  rn TRUE if there
126f0 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61   is a hot journa
12700 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  l on the given p
12710 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20 6a  ager..** A hot j
12720 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68  ournal is one th
12730 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
12740 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  layed back..**.*
12750 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
12760 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
12770 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
12780 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
12790 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
127a0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
127b0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
127c0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
127d0 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
127e0 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
127f0 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65 74  ame.  Just delet
12800 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
12810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73  /.static int has
12820 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  HotJournal(Pager
12830 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
12840 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75   !pPager->useJou
12850 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b  rnal ) return 0;
12860 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 4f  .  if( !sqlite3O
12870 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67  sFileExists(pPag
12880 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 29 20  er->zJournal) ) 
12890 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
128a0 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
128b0 73 65 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67  servedLock(&pPag
128c0 65 72 2d 3e 66 64 29 20 29 20 72 65 74 75 72 6e  er->fd) ) return
128d0 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   0;.  if( sqlite
128e0 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
128f0 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  (pPager)==0 ){. 
12900 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
12910 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
12920 6e 61 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  nal);.    return
12930 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
12940 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d   return 1;.  }.}
12950 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
12960 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
12970 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
12980 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
12990 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
129a0 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
129b0 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
129c0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
129d0 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
129e0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
129f0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67  ased..**.** A _g
12a00 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  et works for any
12a10 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
12a20 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
12a30 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
12a40 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
12a50 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
12a60 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
12a70 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
12a80 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
12a90 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
12aa0 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
12ab0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
12ac0 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
12ad0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
12ae0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
12af0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
12b00 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
12b10 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
12b20 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
12b30 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
12b40 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
12b50 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
12b60 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
12b70 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
12b80 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
12b90 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
12ba0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
12bb0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
12bc0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
12bd0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
12be0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20  pager_lookup(). 
12bf0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
12c00 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29  ne and _lookup()
12c10 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
12c20 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
12c30 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
12c40 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
12c50 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
12c60 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
12c70 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
12c80 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
12c90 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
12ca0 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  as _lookup().** 
12cb0 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
12cc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
12cd0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
12ce0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
12cf0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
12d00 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
12d10 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
12d20 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
12d30 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
12d40 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70  ** Since _lookup
12d50 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
12d60 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
12d70 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
12d80 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
12d90 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
12da0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
12db0 67 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  get(Pager *pPage
12dc0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
12dd0 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20  id **ppPage){.  
12de0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
12df0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
12e00 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
12e10 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
12e20 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
12e30 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a  PT if a page.  *
12e40 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
12e50 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a   than this, or z
12e60 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65  ero, is requeste
12e70 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  d..  */.  if( pg
12e80 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
12e90 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a  O || pgno==0 ){.
12ea0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12eb0 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a  E_CORRUPT;.  }..
12ec0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
12ed0 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
12ee0 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
12ef0 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
12f00 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
12f10 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
12f20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
12f30 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
12f40 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
12f50 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
12f60 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
12f70 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
12f80 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
12f90 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
12fa0 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
12fb0 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
12fc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
12fd0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
12fe0 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
12ff0 4d 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20 21  MDB ){.    if( !
13000 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f  pPager->noReadlo
13010 63 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ck ){.      rc =
13020 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
13030 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52  ock(pPager, SHAR
13040 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
13050 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13060 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
13070 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
13080 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
13090 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
130a0 65 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72  exists, and ther
130b0 65 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44  e is no RESERVED
130c0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20   lock on the.   
130d0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
130e0 65 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65  e, then it eithe
130f0 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c  r needs to be pl
13100 61 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c  ayed back or del
13110 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
13120 20 69 66 28 20 68 61 73 48 6f 74 4a 6f 75 72 6e   if( hasHotJourn
13130 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  al(pPager) ){.  
13140 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
13150 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
13160 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
13170 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
13180 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
13190 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a  t it is.       *
131a0 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
131b0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
131c0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
131d0 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
131e0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43  he.       ** EXC
131f0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
13200 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
13210 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
13220 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a  pen the.       *
13230 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
13240 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
13250 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
13260 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
13270 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  .       ** datab
13280 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
13290 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
132a0 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
132b0 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20  rolling it .    
132c0 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
132d0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a     ** .       **
132e0 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
132f0 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
13300 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
13310 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
13320 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
13330 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
13340 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
13350 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
13360 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20  il to.       ** 
13370 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20  obtain it's own 
13380 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
13390 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
133a0 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ile..       */. 
133b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
133c0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
133d0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
133e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
133f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
13400 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
13410 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
13420 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
13430 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
13440 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
13450 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
13460 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
13480 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
13490 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a  GER_EXCLUSIVE;..
134a0 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
134b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
134c0 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
134d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
134e0 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65   if.       ** we
134f0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f   are unable to o
13500 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
13510 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a  file. .       **
13520 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  .       ** The j
13530 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
13540 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
13550 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20  locked itself.  
13560 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f  The.       ** jo
13570 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
13580 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
13590 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
135a0 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
135b0 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
135c0 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
135d0 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
135e0 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
135f0 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  .       ** proce
13600 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65  sses opening the
13610 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20   journal at the 
13620 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20  same time..     
13630 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
13640 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
13650 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a  adOnly(pPager->z
13660 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
13670 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69  ->jfd);.       i
13680 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
13690 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   ){.         sql
136a0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
136b0 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
136c0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  K);.         pPa
136d0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
136e0 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
136f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13700 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d  E_BUSY;.       }
13710 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
13720 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
13730 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
13740 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
13750 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
13760 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
13770 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
13780 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
13790 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
137a0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
137b0 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62  .       /* Playb
137c0 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
137d0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
137e0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
137f0 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c  rite.       ** l
13800 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
13810 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
13820 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
13830 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
13840 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
13850 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13870 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13880 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
13890 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
138a0 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  se{.    /* Searc
138b0 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61  h for page in ca
138c0 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  che */.    pPg =
138d0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
138e0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
138f0 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50   if( MEMDB && pP
13900 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
13910 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
13920 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13930 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
13940 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
13950 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
13960 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
13970 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
13980 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
13990 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  /.    int h;.   
139a0 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65   TEST_INCR(pPage
139b0 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 69  r->nMiss);.    i
139c0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
139d0 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20  <pPager->mxPage 
139e0 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  || pPager->pFirs
139f0 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b  t==0 || MEMDB ){
13a00 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  .      /* Create
13a10 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20   a new page */. 
13a20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74       pPg = sqlit
13a30 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
13a40 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65  of(*pPg) + pPage
13a50 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  r->pageSize.    
13a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a70 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65            + size
13a80 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72  of(u32) + pPager
13a90 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20  ->nExtra.       
13aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13ab0 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73         + MEMDB*s
13ac0 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
13ad0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   );.      if( pP
13ae0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  g==0 ){.        
13af0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
13b00 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d  |= PAGER_ERR_MEM
13b10 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
13b20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
13b30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d       }.      mem
13b40 73 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65  set(pPg, 0, size
13b50 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20  of(*pPg));.     
13b60 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
13b70 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
13b80 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
13b90 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65  pPager), 0, size
13ba0 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a  of(PgHistory));.
13bb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
13bc0 67 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67  g->pPager = pPag
13bd0 65 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  er;.      pPg->p
13be0 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72  NextAll = pPager
13bf0 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50  ->pAll;.      pP
13c00 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67  ager->pAll = pPg
13c10 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
13c20 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nPage++;.      i
13c30 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
13c40 3e 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67  >pPager->nMaxPag
13c50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
13c60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61  ert( pPager->nMa
13c70 78 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e  xPage==(pPager->
13c80 6e 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20  nPage-1) );.    
13c90 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78      pPager->nMax
13ca0 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Page++;.      }.
13cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13cc0 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20   /* Find a page 
13cd0 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79  to recycle.  Try
13ce0 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67   to locate a pag
13cf0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a  e that does not.
13d00 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65        ** require
13d10 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79   us to do an fsy
13d20 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72  nc() on the jour
13d30 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  nal..      */.  
13d40 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
13d50 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  ->pFirstSynced;.
13d60 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20  .      /* If we 
13d70 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61  could not find a
13d80 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20   page that does 
13d90 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66  not require an f
13da0 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20  sync().      ** 
13db0 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  on the journal f
13dc0 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74  ile then fsync t
13dd0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13de0 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20    This is a.    
13df0 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f    ** very slow o
13e00 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20  peration, so we 
13e10 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f  work hard to avo
13e20 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65  id it.  But some
13e30 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69  times.      ** i
13e40 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
13e50 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
13e60 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
13e70 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d          int rc =
13e80 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
13e90 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ger);.        if
13ea0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
13eb0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
13ec0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
13ed0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
13ee0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
13ef0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
13f00 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
13f10 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
13f20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20         /* If in 
13f30 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
13f40 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
13f50 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
13f60 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61  the..  ** journa
13f70 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  l file. This is 
13f80 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76  done to avoid ev
13f90 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a  er modifying a j
13fa0 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61  ournal..  ** hea
13fb0 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f  der that is invo
13fc0 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  lved in the roll
13fd0 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68  back of pages th
13fe0 61 74 20 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c  at have..  ** al
13ff0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
14000 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
14010 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
14020 68 65 61 64 65 72 20 69 73 0a 09 20 20 2a 2a 20  header is..  ** 
14030 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65  trashed when the
14040 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
14050 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 20  pdated)..       
14060 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
14070 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
14080 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  ;.          asse
14090 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
140a0 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
140b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
140c0 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  teJournalHdr(pPa
140d0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
140e0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
140f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14100 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
14110 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
14120 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14130 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
14140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
14150 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61         pPg = pPa
14160 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20  ger->pFirst;.   
14170 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
14180 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
14190 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69  );..      /* Wri
141a0 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  te the page to t
141b0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
141c0 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e   if it is dirty.
141d0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
141e0 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  if( pPg->dirty )
141f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
14200 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d  ( pPg->needSync=
14210 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
14220 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  g->pDirty = 0;. 
14230 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
14240 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
14250 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20  ( pPg );.       
14260 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14270 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
14280 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
14290 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
142a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
142b0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
142c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
142d0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
142e0 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
142f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
14300 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79  page we are recy
14310 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20  cling is marked 
14320 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
14330 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  k, then.      **
14340 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20   set the global 
14350 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
14360 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c  lag, thus disabl
14370 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ing the.      **
14380 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c   sqlite_dont_rol
14390 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61  lback() optimiza
143a0 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73  tion for the res
143b0 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61  t of this transa
143c0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  ction..      ** 
143d0 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  It is necessary 
143e0 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75  to do this becau
143f0 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b  se the page mark
14400 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
14410 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74  k.      ** might
14420 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
14430 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
14440 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
14450 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
14460 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69  .      ** that i
14470 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77  s was marked alw
14480 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  aysRollback.  Th
14490 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c  is means that al
144a0 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20  l pages must.   
144b0 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20     ** be marked 
144c0 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  as alwaysRollbac
144d0 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f  k from here on o
144e0 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ut..      */.   
144f0 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61     if( pPg->alwa
14500 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
14510 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c        pPager->al
14520 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
14530 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
14540 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f   /* Unlink the o
14550 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  ld page from the
14560 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74   free list and t
14570 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20  he hash table.  
14580 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c      */.      unl
14590 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
145a0 20 20 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50      TEST_INCR(pP
145b0 61 67 65 72 2d 3e 6e 4f 76 66 6c 29 3b 0a 20 20  ager->nOvfl);.  
145c0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e    }.    pPg->pgn
145d0 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66  o = pgno;.    if
145e0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
145f0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e  rnal && (int)pgn
14600 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  o<=pPager->origD
14610 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73  bSize ){.      s
14620 71 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72  qlite3CheckMemor
14630 79 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  y(pPager->aInJou
14640 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20  rnal, pgno/8);. 
14650 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14660 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
14670 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
14680 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
14690 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
146a0 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
146b0 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20  no&7)))!=0;.    
146c0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
146d0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
146e0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
146f0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
14700 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
14710 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
14720 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
14730 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70   && (int)pgno<=p
14740 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a  Pager->stmtSize.
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
14760 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
14770 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
14780 70 67 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a  pgno&7)))!=0 ){.
14790 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
147a0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
147b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
147c0 20 20 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66     page_remove_f
147d0 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  rom_stmt_list(pP
147e0 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  g);.    }.    pP
147f0 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
14800 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b    pPg->nRef = 1;
14810 0a 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67  .    REFINFO(pPg
14820 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  );.    pPager->n
14830 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70  Ref++;.    h = p
14840 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
14850 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
14860 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
14870 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67  ash[h];.    pPag
14880 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
14890 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d  Pg;.    if( pPg-
148a0 3e 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20  >pNextHash ){.  
148b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
148c0 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
148d0 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20  vHash==0 );.    
148e0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
148f0 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50  ->pPrevHash = pP
14900 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  g;.    }.    if(
14910 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e   pPager->nExtra>
14920 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
14930 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
14940 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
14950 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
14960 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
14970 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14980 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  !=0 ){.      sql
14990 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
149a0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
149b0 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  g));.      rc = 
149c0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
149d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ager);.      ret
149e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
149f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 70 61 67    if( sqlite3pag
14a00 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
14a10 67 65 72 29 3c 28 69 6e 74 29 70 67 6e 6f 20 29  ger)<(int)pgno )
14a20 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
14a30 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
14a40 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
14a50 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c  geSize);.    }el
14a60 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  se{.      int rc
14a70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
14a80 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20  MEMDB==0 );.    
14a90 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
14aa0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
14ab0 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
14ac0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14ad0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14ae0 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
14af0 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
14b00 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
14b10 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
14b20 20 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25   TRACE3("FETCH %
14b30 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
14b40 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
14b50 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
14b60 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50   CODEC(pPager, P
14b70 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
14b80 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  ), pPg->pgno, 3)
14b90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
14ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14bb0 20 20 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a       i64 fileSiz
14bc0 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
14bd0 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
14be0 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69  (&pPager->fd,&fi
14bf0 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f  leSize)!=SQLITE_
14c00 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  OK.             
14c10 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70    || fileSize>=p
14c20 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65  gno*pPager->page
14c30 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
14c40 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
14c50 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41  nref(PGHDR_TO_DA
14c60 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20  TA(pPg));.      
14c70 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
14c80 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
14c90 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50          memset(P
14ca0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
14cb0 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61  ), 0, pPager->pa
14cc0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
14cd0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
14ce0 20 20 20 20 20 20 20 20 54 45 53 54 5f 49 4e 43          TEST_INC
14cf0 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 29  R(pPager->nRead)
14d00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14d10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
14d20 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
14d30 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
14d40 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
14d50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
14d60 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
14d70 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
14d80 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
14d90 65 2e 20 2a 2f 0a 20 20 20 20 54 45 53 54 5f 49  e. */.    TEST_I
14da0 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74  NCR(pPager->nHit
14db0 29 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  );.    page_ref(
14dc0 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
14dd0 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  age = PGHDR_TO_D
14de0 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ATA(pPg);.  retu
14df0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14e00 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
14e10 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
14e20 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
14e30 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
14e40 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
14e50 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
14e60 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
14e70 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
14e80 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
14e90 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
14ea0 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
14eb0 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
14ec0 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64  er_get().  The d
14ed0 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
14ee0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
14ef0 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67  * and sqlite3pag
14f00 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74  er_get() is that
14f10 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
14f20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
14f30 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
14f40 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
14f50 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
14f60 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
14f70 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
14f80 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
14f90 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
14fa0 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
14fb0 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
14fc0 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
14fd0 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
14fe0 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  3pager_lookup(Pa
14ff0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
15000 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
15010 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
15020 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
15030 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
15040 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
15050 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
15060 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
15070 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
15080 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
15090 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
150a0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
150b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
150c0 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
150d0 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
150e0 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
150f0 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
15100 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
15110 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
15120 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
15130 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
15140 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
15150 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
15160 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
15170 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
15180 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
15190 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
151a0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
151b0 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
151c0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
151d0 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
151e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
151f0 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
15200 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
15210 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
15220 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
15230 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
15240 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
15250 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
15260 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
15270 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
15280 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
15290 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
152a0 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
152b0 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
152c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
152d0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
152e0 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
152f0 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
15300 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
15310 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
15320 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
15330 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
15340 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50  ){.    Pager *pP
15350 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72  ager;.    pPager
15360 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
15370 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72      pPg->pNextFr
15380 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ee = 0;.    pPg-
15390 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 61  >pPrevFree = pPa
153a0 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20  ger->pLast;.    
153b0 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20  pPager->pLast = 
153c0 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67  pPg;.    if( pPg
153d0 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
153e0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46       pPg->pPrevF
153f0 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  ree->pNextFree =
15400 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   pPg;.    }else{
15410 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70  .      pPager->p
15420 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20  First = pPg;.   
15430 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
15440 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70  needSync==0 && p
15450 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
15460 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ced==0 ){.      
15470 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
15480 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20  nced = pPg;.    
15490 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  }.    if( pPager
154a0 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
154b0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78  .      pPager->x
154c0 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74 61  Destructor(pData
154d0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
154e0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ze);.    }.  .  
154f0 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61    /* When all pa
15500 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66 72  ges reach the fr
15510 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65  eelist, drop the
15520 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a   read lock from.
15530 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
15540 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
15550 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
15560 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  f--;.    assert(
15570 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30   pPager->nRef>=0
15580 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
15590 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
155a0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
155b0 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
155c0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
155d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
155e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
155f0 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
15600 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
15610 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
15620 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
15630 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
15640 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
15650 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
15660 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15670 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
15680 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
15690 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
156a0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
156b0 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
156c0 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
156d0 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
156e0 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
156f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
15700 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
15710 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
15720 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21   rc;.  assert( !
15730 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
15740 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
15750 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
15760 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
15770 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
15780 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  n==0 );.  assert
15790 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
157a0 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  rnal );.  assert
157b0 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
157c0 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  rnal==0 );.  sql
157d0 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
157e0 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70  unt(pPager);.  p
157f0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
15800 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  l = sqliteMalloc
15810 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
15820 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20  /8 + 1 );.  if( 
15830 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
15840 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  al==0 ){.    rc 
15850 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
15860 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f      goto failed_
15870 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b  to_open_journal;
15880 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
15890 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69  te3OsOpenExclusi
158a0 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ve(pPager->zJour
158b0 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  nal, &pPager->jf
158c0 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  d,pPager->tempFi
158d0 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  le);.  pPager->j
158e0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
158f0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
15900 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
15910 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
15920 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
15930 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
15940 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
15950 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
15960 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28 70 50 61  SET_FULLSYNC(pPa
15970 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
15980 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 53  ->fullSync);.  S
15990 45 54 5f 46 55 4c 4c 53 59 4e 43 28 70 50 61 67  ET_FULLSYNC(pPag
159a0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
159b0 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c  fullSync);.  sql
159c0 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74  ite3OsOpenDirect
159d0 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  ory(pPager->zDir
159e0 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72 2d  ectory, &pPager-
159f0 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d  >jfd);.  pPager-
15a00 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
15a10 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
15a20 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a  nalStarted = 0;.
15a30 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
15a40 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
15a50 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
15a60 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
15a70 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20  nRec = 0;.  if( 
15a80 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
15a90 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
15aa0 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
15ab0 67 65 72 29 3b 0a 20 20 20 20 67 6f 74 6f 20 66  ger);.    goto f
15ac0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
15ad0 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
15ae0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
15af0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
15b00 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
15b10 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
15b20 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
15b30 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
15b40 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
15b50 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15b60 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
15b70 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
15b80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15b90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
15ba0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
15bb0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
15bc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
15bd0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
15be0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
15bf0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
15c00 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
15c10 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
15c20 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
15c30 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
15c40 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
15c50 6e 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  nal = 0;.  sqlit
15c60 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
15c70 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
15c80 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
15c90 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
15ca0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
15cb0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
15cc0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
15cd0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
15ce0 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
15cf0 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
15d00 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
15d10 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
15d20 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
15d30 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
15d40 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
15d50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
15d60 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
15d70 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
15d80 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
15d90 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
15da0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
15db0 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
15dc0 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
15dd0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
15de0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
15df0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
15e00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
15e10 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
15e20 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
15e30 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
15e40 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
15e50 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
15e60 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
15e70 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
15e80 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
15e90 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
15ea0 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
15eb0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
15ec0 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
15ed0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
15ee0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
15ef0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
15f00 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
15f10 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
15f20 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
15f30 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
15f40 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
15f50 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
15f60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
15f70 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
15f80 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
15f90 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
15fa0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
15fb0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
15fc0 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
15fd0 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
15fe0 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
15ff0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
16000 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
16010 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
16020 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
16030 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
16040 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
16050 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
16060 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
16070 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
16080 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
16090 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
160a0 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
160b0 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
160c0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
160d0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
160e0 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
160f0 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
16100 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
16110 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
16120 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
16130 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
16140 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
16150 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
16160 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
16170 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  in(void *pData, 
16180 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
16190 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
161a0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
161b0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
161c0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
161d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
161e0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
161f0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
16200 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16210 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
16220 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
16230 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
16240 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
16250 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16260 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
16270 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
16280 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
16290 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
162a0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
162b0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
162c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
162d0 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
162e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
162f0 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65  te3OsLock(&pPage
16300 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f  r->fd, RESERVED_
16310 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
16320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
16330 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
16340 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
16350 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
16360 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
16370 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
16380 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
16390 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
163a0 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
163b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
163c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
163d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
163e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
163f0 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
16400 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
16410 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
16420 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
16430 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
16440 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
16450 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
16460 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
16470 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
16480 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
16490 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
164a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
164b0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
164c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
164d0 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
164e0 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
164f0 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
16500 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
16510 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
16520 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
16530 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
16540 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
16550 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
16560 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
16570 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
16580 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
16590 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
165a0 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
165b0 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
165c0 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
165d0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
165e0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
165f0 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
16600 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
16610 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
16620 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
16630 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
16640 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
16650 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
16660 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
16670 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
16680 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
16690 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
166a0 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
166b0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
166c0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
166d0 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
166e0 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
166f0 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
16700 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
16710 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
16720 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
16730 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
16740 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
16750 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
16760 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
16770 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
16780 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
16790 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
167a0 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
167b0 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
167c0 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
167d0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
167e0 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
167f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16800 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
16810 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
16820 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
16830 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
16840 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
16850 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
16860 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
16870 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
16880 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
16890 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
168a0 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
168b0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
168c0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
168d0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
168e0 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
168f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
16900 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
16910 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
16920 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
16930 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
16940 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
16950 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
16960 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
16970 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
16980 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
16990 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
169a0 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
169b0 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69  ..  */.  pPg->di
169c0 72 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70  rty = 1;.  if( p
169d0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26  Pg->inJournal &&
169e0 20 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c   (pPg->inStmt ||
169f0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
16a00 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50  se==0) ){.    pP
16a10 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
16a20 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
16a30 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
16a40 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
16a50 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
16a60 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
16a70 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
16a80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
16a90 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
16aa0 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
16ab0 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
16ac0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
16ad0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
16ae0 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
16af0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
16b00 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
16b10 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
16b20 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
16b30 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
16b40 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
16b50 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
16b60 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
16b70 67 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 2c  ger_begin(pData,
16b80 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
16b90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16ba0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
16bb0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
16bc0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
16bd0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
16be0 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ;.    if( !pPage
16bf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26  r->journalOpen &
16c00 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
16c10 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63  rnal ){.      rc
16c20 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
16c30 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
16c40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
16c50 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
16c60 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
16c70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
16c80 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50  urnalOpen || !pP
16c90 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
16ca0 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
16cb0 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
16cc0 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
16cd0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
16ce0 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
16cf0 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
16d00 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
16d10 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
16d20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
16d30 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
16d40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
16d50 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
16d60 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
16d70 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
16d80 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
16d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
16da0 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
16db0 26 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a  && (pPager->useJ
16dc0 6f 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29  ournal || MEMDB)
16dd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
16de0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
16df0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
16e00 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ze ){.        in
16e10 74 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  t szPg;.        
16e20 75 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20  u32 saved;.     
16e30 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
16e40 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74            PgHist
16e50 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
16e60 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
16e70 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
16e80 20 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e     TRACE3("JOURN
16e90 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
16ea0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
16eb0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
16ec0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
16ed0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30   pHist->pOrig==0
16ee0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48   );.          pH
16ef0 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c  ist->pOrig = sql
16f00 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50  iteMallocRaw( pP
16f10 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29  ager->pageSize )
16f20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
16f30 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
16f40 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
16f50 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c  py(pHist->pOrig,
16f60 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
16f70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
16f80 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
16f90 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
16fa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32  e{.          u32
16fb0 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20   cksum;.        
16fc0 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
16fd0 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f  pData, pPg->pgno
16fe0 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 7);.          
16ff0 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b  cksum = pager_ck
17000 73 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d  sum(pPager, pPg-
17010 3e 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20  >pgno, pData);. 
17020 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
17030 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f   *(u32*)PGHDR_TO
17040 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
17050 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
17060 74 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d  tore32bits(cksum
17070 2c 20 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  , pPg, pPager->p
17080 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17090 20 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65      szPg = pPage
170a0 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20  r->pageSize+8;. 
170b0 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32           store32
170c0 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20  bits(pPg->pgno, 
170d0 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20  pPg, -4);.      
170e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
170f0 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
17100 3e 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70  >jfd, &((char*)p
17110 44 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29  Data)[-4], szPg)
17120 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
17130 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
17140 3d 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20  = szPg;.        
17150 20 20 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41    TRACE4("JOURNA
17160 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  L %d page %d nee
17170 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
17180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
17190 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
171a0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
171b0 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20  needSync);.     
171c0 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
171d0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
171e0 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  gno, 0);.       
171f0 20 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f     *(u32*)PGHDR_
17200 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
17210 61 67 65 72 29 20 3d 20 73 61 76 65 64 3b 0a 20  ager) = saved;. 
17220 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
17230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17240 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
17250 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
17260 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17270 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
17280 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
17290 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  R_FULL;.        
172a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
172b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
172c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
172d0 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61  c++;.          a
172e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
172f0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
17300 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
17310 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67  ->aInJournal[pPg
17320 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
17330 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
17340 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
17350 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
17360 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
17370 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
17380 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
17390 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
173a0 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
173b0 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
173c0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
173d0 20 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f         page_add_
173e0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
173f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
17400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
17410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
17420 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70  g->needSync = !p
17430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
17440 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72  arted && !pPager
17450 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
17460 20 20 54 52 41 43 45 34 28 22 41 50 50 45 4e 44    TRACE4("APPEND
17470 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
17480 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
17490 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
174a0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
174b0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
174c0 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a  dSync);.      }.
174d0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e        if( pPg->n
174e0 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  eedSync ){.     
174f0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
17500 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ync = 1;.      }
17510 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
17520 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d  urnal = 1;.    }
17530 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
17540 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
17550 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20  nal is open and 
17560 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
17570 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68  in it,.    ** th
17580 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72  en write the cur
17590 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65  rent page to the
175a0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
175b0 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20  al.  Note that. 
175c0 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d     ** the statem
175d0 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ent journal form
175e0 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20  at differs from 
175f0 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75  the standard jou
17600 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20  rnal format.    
17610 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d  ** in that it om
17620 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d  its the checksum
17630 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72  s and the header
17640 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
17650 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
17660 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
17670 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
17680 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
17690 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  mtSize ){.      
176a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
176b0 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
176c0 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
176d0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
176e0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
176f0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
17700 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
17710 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
17720 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
17730 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
17740 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
17750 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
17760 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
17770 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
17780 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
17790 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
177a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
177b0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
177c0 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
177d0 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
177e0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
177f0 20 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43    }.        TRAC
17800 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
17810 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
17820 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
17830 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
17840 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17850 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
17860 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
17870 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
17880 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
17890 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
178a0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
178b0 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
178c0 65 72 2d 3e 73 74 66 64 2c 28 28 63 68 61 72 2a  er->stfd,((char*
178d0 29 70 44 61 74 61 29 2d 34 2c 20 70 50 61 67 65  )pData)-4, pPage
178e0 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a  r->pageSize+4);.
178f0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
17900 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
17910 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
17920 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
17930 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
17940 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
17950 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
17960 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
17970 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17980 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
17990 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
179a0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
179b0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
179c0 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
179d0 52 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20  R_FULL;.        
179e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
179f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
17a00 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
17a10 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
17a20 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
17a30 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt!=0 );.       
17a40 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
17a50 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
17a60 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
17a70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17a80 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
17a90 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
17aa0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64   }.  }..  /* Upd
17ab0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
17ac0 20 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e   size and return
17ad0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
17ae0 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
17af0 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20  )pPg->pgno ){.  
17b00 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
17b10 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
17b20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20    if( !MEMDB && 
17b30 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
17b40 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
17b50 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
17b60 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
17b70 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20  bSize++;.    }. 
17b80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17b90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
17ba0 54 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65  TRUE if the page
17bb0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72   given in the ar
17bc0 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69  gument was previ
17bd0 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20  ously passed.** 
17be0 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
17bf0 77 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68  write().  In oth
17c00 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e  er words, return
17c10 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f   TRUE if it is o
17c20 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74  k.** to change t
17c30 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
17c40 65 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73  e page..*/.int s
17c50 71 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72  qlite3pager_iswr
17c60 69 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44  iteable(void *pD
17c70 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
17c80 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
17c90 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
17ca0 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a  urn pPg->dirty;.
17cb0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
17cc0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
17cd0 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
17ce0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
17cf0 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
17d00 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
17d10 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
17d20 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
17d30 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72  qlite3pager_over
17d40 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
17d50 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
17d60 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
17d70 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69  void *pPage;.  i
17d80 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
17d90 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
17da0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
17db0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
17dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17dd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
17de0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
17df0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17e00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17e10 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70   memcpy(pPage, p
17e20 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
17e30 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
17e40 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
17e50 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
17e60 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17e70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
17e80 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f   call to this ro
17e90 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20  utine tells the 
17ea0 70 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73  pager that it is
17eb0 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
17ec0 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69  o.** write the i
17ed0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61  nformation on pa
17ee0 67 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74  ge "pgno" back t
17ef0 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
17f00 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
17f10 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
17f20 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
17f30 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
17f40 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
17f50 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
17f60 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
17f70 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
17f80 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
17f90 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
17fa0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
17fb0 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
17fc0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
17fd0 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
17fe0 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
17ff0 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
18000 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
18010 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
18020 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61  the.** sqlite3pa
18030 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
18040 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20  k() below, more 
18050 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20  than double the 
18060 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67  speed.** of larg
18070 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69  e INSERT operati
18080 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c  ons and quadrupl
18090 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
180a0 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a  arge DELETEs..**
180b0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
180c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
180d0 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52   set the alwaysR
180e0 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20  ollback flag to 
180f0 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75  true..** Subsequ
18100 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
18110 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
18120 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68  ollback() for th
18130 65 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77  e same page.** w
18140 69 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62  ill thereafter b
18150 65 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  e ignored.  This
18160 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f   is necessary to
18170 20 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d   avoid a problem
18180 0a 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65  .** where a page
18190 20 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64   with data is ad
181a0 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
181b0 69 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70  ist during one p
181c0 61 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e  art of.** a tran
181d0 73 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d  saction then rem
181e0 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72  oved from the fr
181f0 65 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20  eelist during a 
18200 6c 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66  later part.** of
18210 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61   the same transa
18220 63 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64  ction and reused
18230 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20   for some other 
18240 70 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69  purpose.  When i
18250 74 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64  t.** is first ad
18260 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
18270 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
18280 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68  e is called.  Wh
18290 65 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68  en reused,.** th
182a0 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
182b0 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  ) routine is cal
182c0 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73  led.  But becaus
182d0 65 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61  e the page conta
182e0 69 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20  ins.** critical 
182f0 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e  data, we still n
18300 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69  eed to be sure i
18310 74 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61  t gets rolled ba
18320 63 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f  ck in spite.** o
18330 66 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62  f the dont_rollb
18340 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76  ack() call..*/.v
18350 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
18360 5f 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65  _dont_write(Page
18370 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
18380 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a  pgno){.  PgHdr *
18390 70 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  pPg;..  if( MEMD
183a0 42 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70  B ) return;..  p
183b0 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
183c0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
183d0 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  .  pPg->alwaysRo
183e0 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66  llback = 1;.  if
183f0 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69  ( pPg && pPg->di
18400 72 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70  rty ){.    if( p
18410 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28  Pager->dbSize==(
18420 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26  int)pPg->pgno &&
18430 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18440 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69  ize<pPager->dbSi
18450 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ze ){.      /* I
18460 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20  f this pages is 
18470 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e  the last page in
18480 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68   the file and th
18490 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e  e file has grown
184a0 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  .      ** during
184b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
184c0 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64  nsaction, then d
184d0 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70  o NOT mark the p
184e0 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20  age as clean..  
184f0 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20      ** When the 
18500 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72  database file gr
18510 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b  ows, we must mak
18520 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
18530 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20  last page.      
18540 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20  ** gets written 
18550 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f  at least once so
18560 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66   that the disk f
18570 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20  ile will be the 
18580 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a  correct.      **
18590 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f   size. If you do
185a0 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20   not write this 
185b0 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a  page and the siz
185c0 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20  e of the file.  
185d0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69      ** on the di
185e0 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67  sk ends up being
185f0 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74   too small, that
18600 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74   can lead to dat
18610 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63  abase.      ** c
18620 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67  orruption during
18630 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61   the next transa
18640 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
18650 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
18660 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52   TRACE3("DONT_WR
18670 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
18680 64 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45  d\n", pgno, PAGE
18690 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
186a0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
186b0 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
186c0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
186d0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
186e0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
186f0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
18700 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
18710 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
18720 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
18730 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
18740 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
18750 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
18760 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
18770 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
18780 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
18790 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
187a0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
187b0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
187c0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
187d0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
187e0 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
187f0 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
18800 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
18810 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61  llback(void *pDa
18820 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
18830 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
18840 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
18850 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
18860 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  >pPager;..  if( 
18870 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
18880 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
18890 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
188a0 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72  lOpen==0 ) retur
188b0 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  n;.  if( pPg->al
188c0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
188d0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
188e0 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20  llback || MEMDB 
188f0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
18900 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
18910 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
18920 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
18930 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  gDbSize ){.    a
18940 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
18950 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
18960 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
18970 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
18980 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
18990 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
189a0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
189b0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
189c0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
189d0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
189e0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
189f0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
18a00 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65  o&7);.      page
18a10 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
18a20 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
18a30 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52    TRACE3("DONT_R
18a40 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20  OLLBACK page %d 
18a50 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
18a60 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
18a70 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ger));.  }.  if(
18a80 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
18a90 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
18aa0 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
18ab0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
18ac0 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
18ad0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
18ae0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
18af0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
18b00 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
18b10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
18b20 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
18b30 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
18b40 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
18b50 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
18b60 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
18b70 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
18b80 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66  Pg);.  }.}...#if
18b90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18ba0 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
18bb0 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
18bc0 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
18bd0 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
18be0 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
18bf0 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46  Hist){.  sqliteF
18c00 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
18c10 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
18c20 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
18c30 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
18c40 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d  0;.  pHist->pStm
18c50 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  t = 0;.}.#else.#
18c60 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74  define clearHist
18c70 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  ory(x).#endif../
18c80 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
18c90 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
18ca0 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
18cb0 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
18cc0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
18cd0 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
18ce0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
18cf0 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
18d00 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
18d10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
18d20 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
18d30 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
18d40 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
18d50 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
18d60 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18d70 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50  commit(Pager *pP
18d80 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
18d90 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
18da0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18db0 72 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52  rMask==PAGER_ERR
18dc0 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20  _FULL ){.    rc 
18dd0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  = sqlite3pager_r
18de0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
18df0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
18e00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
18e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
18e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
18e30 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
18e40 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
18e50 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
18e60 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
18e70 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
18e80 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
18e90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
18ea0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
18eb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18ec0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  E_ERROR;.  }.  T
18ed0 52 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64  RACE2("COMMIT %d
18ee0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18ef0 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
18f00 44 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20  DB ){.    pPg = 
18f10 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
18f20 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72  rty_pages(pPager
18f30 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50  );.    while( pP
18f40 67 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72  g ){.      clear
18f50 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
18f60 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
18f70 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  r));.      pPg->
18f80 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
18f90 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
18fa0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
18fb0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
18fc0 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
18fd0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
18fe0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
18ff0 20 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a   = pPg->pDirty;.
19000 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
19010 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67  EBUG.    for(pPg
19020 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
19030 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
19040 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
19050 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
19060 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
19070 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
19080 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
19090 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
190a0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
190b0 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
190c0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
190d0 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
190e0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
190f0 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
19100 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
19110 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
19120 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72  HARED;.    retur
19130 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
19140 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
19150 69 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a  irtyCache==0 ){.
19160 20 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c      /* Exit earl
19170 79 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67  y (without doing
19180 20 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d   the time-consum
19190 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  ing sqlite3OsSyn
191a0 63 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a  c() calls).    *
191b0 2a 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20  * if there have 
191c0 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20  been no changes 
191d0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
191e0 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  file. */.    ass
191f0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
19200 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
19210 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
19220 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
19230 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
19240 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
19250 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
19260 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
19270 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72  urnalOpen );.  r
19280 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
19290 5f 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c  _sync(pPager, 0,
192a0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
192b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
192c0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72  goto commit_abor
192d0 74 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61  t;.  }.  rc = pa
192e0 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
192f0 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
19300 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
19310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20    return rc;..  
19320 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
19330 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72  anything goes wr
19340 6f 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20 63  ong during the c
19350 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20  ommit process.. 
19360 20 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74   */.commit_abort
19370 3a 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  :.  sqlite3pager
19380 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
19390 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
193a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63  }../*.** Rollbac
193b0 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20  k all changes.  
193c0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c  The database fal
193d0 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52  ls back to PAGER
193e0 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a  _SHARED mode..**
193f0 20 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   All in-memory c
19400 61 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72  ache pages rever
19410 74 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69  t to their origi
19420 6e 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  nal data content
19430 73 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  s..** The journa
19440 6c 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  l is deleted..**
19450 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19460 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c   cannot fail unl
19470 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ess some other p
19480 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f  rocess is not fo
19490 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63  llowing.** the c
194a0 6f 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70  orrect locking p
194b0 72 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f  rotocol (SQLITE_
194c0 50 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c  PROTOCOL) or unl
194d0 65 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a  ess some other.*
194e0 2a 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69  * process is wri
194f0 74 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20  ting trash into 
19500 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
19510 20 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   (SQLITE_CORRUPT
19520 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61  ) or.** unless a
19530 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20   prior malloc() 
19540 66 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e  failed (SQLITE_N
19550 4f 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69  OMEM).  Appropri
19560 61 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ate error.** cod
19570 65 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20  es are returned 
19580 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63  for all these oc
19590 63 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77  casions.  Otherw
195a0 69 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ise,.** SQLITE_O
195b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
195c0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
195d0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  er_rollback(Page
195e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
195f0 74 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22  t rc;.  TRACE2("
19600 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20  ROLLBACK %d\n", 
19610 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
19620 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
19630 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
19640 20 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d     for(p=pPager-
19650 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70  >pAll; p; p=p->p
19660 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
19670 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
19680 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
19690 21 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  !p->alwaysRollba
196a0 63 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ck );.      if( 
196b0 21 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  !p->dirty ){.   
196c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
196d0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
196e0 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
196f0 67 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a  ger))->pOrig );.
19700 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
19710 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50  !((PgHistory *)P
19720 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20  GHDR_TO_HIST(p, 
19730 70 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20  pPager))->pStmt 
19740 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
19750 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  nue;.      }..  
19760 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
19770 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
19780 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
19790 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a  pHist->pOrig ){.
197a0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50          memcpy(P
197b0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
197c0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70   pHist->pOrig, p
197d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
197e0 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33  ;.        TRACE3
197f0 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20  ("ROLLBACK-PAGE 
19800 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e  %d of %d\n", p->
19810 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50  pgno, PAGERID(pP
19820 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65  ager));.      }e
19830 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41  lse{.        TRA
19840 43 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20  CE3("PAGE %d is 
19850 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20  clean on %d\n", 
19860 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
19870 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
19880 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69   }.      clearHi
19890 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20  story(pHist);.  
198a0 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30      p->dirty = 0
198b0 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75  ;.      p->inJou
198c0 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20  rnal = 0;.      
198d0 70 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  p->inStmt = 0;. 
198e0 20 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d       p->pPrevStm
198f0 74 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74  t = p->pNextStmt
19900 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28   = 0;..      if(
19910 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
19920 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  er ){.        pP
19930 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
19940 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
19950 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
19960 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
19970 20 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50     .    }.    pP
19980 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  ager->pStmt = 0;
19990 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
199a0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72  ize = pPager->or
199b0 69 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65  igDbSize;.    me
199c0 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
199d0 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
199e0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
199f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
19a00 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
19a10 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  D;.    return SQ
19a20 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
19a30 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
19a40 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
19a50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
19a60 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
19a70 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
19a80 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
19a90 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
19aa0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19ab0 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
19ac0 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20  ->errMask!=0 && 
19ad0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
19ae0 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20  =PAGER_ERR_FULL 
19af0 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
19b00 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
19b10 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
19b20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
19b30 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
19b40 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65  .    return page
19b50 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
19b60 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  );.  }.  if( pPa
19b70 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
19b80 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
19b90 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72    int rc2;.    r
19ba0 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64  c = pager_reload
19bb0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
19bc0 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
19bd0 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
19be0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
19bf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19c00 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
19c10 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
19c20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
19c30 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
19c40 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
19c50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
19c60 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
19c70 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55  ;  /* bkpt-CORRU
19c80 50 54 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  PT */.    pPager
19c90 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
19ca0 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
19cb0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
19cc0 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
19cd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19ce0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
19cf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19d00 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
19d10 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
19d20 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
19d30 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
19d40 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
19d50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
19d60 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
19d70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19d80 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
19d90 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
19da0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19db0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
19dc0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
19dd0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
19de0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
19df0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
19e00 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
19e10 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
19e20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
19e30 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
19e40 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
19e50 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
19e60 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
19e70 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
19e80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
19e90 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
19ea0 3e 65 72 72 4d 61 73 6b 3b 0a 23 69 66 64 65 66  >errMask;.#ifdef
19eb0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 61   SQLITE_TEST.  a
19ec0 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
19ed0 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
19ee0 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
19ef0 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76  8] = pPager->nOv
19f00 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61  fl;.  a[9] = pPa
19f10 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
19f20 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
19f30 72 69 74 65 3b 0a 23 65 6e 64 69 66 0a 20 20 72  rite;.#endif.  r
19f40 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn a;.}../*.*
19f50 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
19f60 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
19f70 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
19f80 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
19f90 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
19fa0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
19fb0 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
19fc0 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
19fd0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
19fe0 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
19ff0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
1a000 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
1a010 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
1a020 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
1a030 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
1a040 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1a050 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1a060 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  begin(Pager *pPa
1a070 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
1a080 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51 4c    char zTemp[SQL
1a090 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
1a0a0 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70  E];.  assert( !p
1a0b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a0c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1a0d0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
1a0e0 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54 4d  );.  TRACE2("STM
1a0f0 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20 50  T-BEGIN %d\n", P
1a100 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
1a110 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
1a120 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1a130 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20 70  InUse = 1;.    p
1a140 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
1a150 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1a160 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a170 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1a180 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
1a190 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70 50  alOpen ){.    pP
1a1a0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
1a1b0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  en = 1;.    retu
1a1c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1a1d0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  }.  assert( pPag
1a1e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a1f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  );.  pPager->aIn
1a200 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Stmt = sqliteMal
1a210 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53  loc( pPager->dbS
1a220 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69  ize/8 + 1 );.  i
1a230 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  f( pPager->aInSt
1a240 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  mt==0 ){.    sql
1a250 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
1a260 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
1a270 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OCK);.    return
1a280 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a290 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
1a2a0 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  G.  rc = sqlite3
1a2b0 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67  OsFileSize(&pPag
1a2c0 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
1a2d0 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20  ->stmtJSize);.  
1a2e0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74  if( rc ) goto st
1a2f0 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b  mt_begin_failed;
1a300 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1a310 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d 20  r->stmtJSize == 
1a320 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a330 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 70  ff );.#endif.  p
1a340 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
1a350 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
1a360 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d  alOff;.  pPager-
1a370 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
1a380 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70 50  er->dbSize;.  pP
1a390 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
1a3a0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1a3b0 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61 67  stmtCksum = pPag
1a3c0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
1a3d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 74   if( !pPager->st
1a3e0 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63  mtOpen ){.    rc
1a3f0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1a400 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20  opentemp(zTemp, 
1a410 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
1a420 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1a430 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
1a440 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  led;.    pPager-
1a450 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20  >stmtOpen = 1;. 
1a460 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e     pPager->stmtN
1a470 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  Rec = 0;.  }.  p
1a480 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a490 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 1;.  return S
1a4a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74  QLITE_OK;. .stmt
1a4b0 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20  _begin_failed:. 
1a4c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
1a4d0 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
1a4e0 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
1a4f0 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
1a500 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30  ger->aInStmt = 0
1a510 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a520 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
1a530 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  it a statement..
1a540 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1a550 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
1a560 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a570 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1a580 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50  mtInUse ){.    P
1a590 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78  gHdr *pPg, *pNex
1a5a0 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22 53  t;.    TRACE2("S
1a5b0 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22  TMT-COMMIT %d\n"
1a5c0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1a5d0 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  ));.    if( !MEM
1a5e0 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  DB ){.      sqli
1a5f0 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
1a600 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20  r->stfd, 0);.   
1a610 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
1a620 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
1a630 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20  >stfd, 0); */.  
1a640 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
1a650 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
1a660 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
1a670 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  >aInStmt = 0;.  
1a680 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67 3d    }.    for(pPg=
1a690 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
1a6a0 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
1a6b0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50        pNext = pP
1a6c0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
1a6d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1a6e0 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  >inStmt );.     
1a6f0 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pPg->inStmt = 0
1a700 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
1a710 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  evStmt = pPg->pN
1a720 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  extStmt = 0;.   
1a730 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1a740 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72          PgHistor
1a750 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
1a760 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
1a770 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 73  ager);.        s
1a780 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
1a790 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
1a7a0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
1a7b0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
1a7c0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
1a7d0 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
1a7e0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
1a7f0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
1a800 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
1a810 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
1a820 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
1a830 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
1a850 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ck a statement..
1a860 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1a870 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61 63  ger_stmt_rollbac
1a880 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
1a890 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  {.  int rc;.  if
1a8a0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1a8b0 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43 45  Use ){.    TRACE
1a8c0 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b  2("STMT-ROLLBACK
1a8d0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1a8e0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
1a8f0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1a900 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20   PgHdr *pPg;.   
1a910 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
1a920 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
1a930 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  Pg=pPg->pNextStm
1a940 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69  t){.        PgHi
1a950 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
1a960 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
1a970 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
1a980 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53     if( pHist->pS
1a990 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tmt ){.         
1a9a0 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
1a9b0 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69 73  _DATA(pPg), pHis
1a9c0 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72  t->pStmt, pPager
1a9d0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
1a9e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65         sqliteFre
1a9f0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
1aa00 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
1aa10 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1aa20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1aa30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1aa40 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
1aa50 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d 65  mtSize;.      me
1aa60 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
1aa70 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ger);.      rc =
1aa80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1aa90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1aaa0 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  = pager_stmt_pla
1aab0 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
1aac0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1aad0 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69  pager_stmt_commi
1aae0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
1aaf0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
1ab00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
1ab10 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
1ab20 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
1ab30 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
1ab40 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61  turn the full pa
1ab50 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  thname of the da
1ab60 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a  tabase file..*/.
1ab70 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1ab80 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61 6d  te3pager_filenam
1ab90 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1aba0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1abb0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
1abc0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1abd0 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
1abe0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1abf0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1ac00 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 69  *sqlite3pager_di
1ac10 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
1ac20 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
1ac30 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
1ac40 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
1ac50 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
1ac60 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
1ac70 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
1ac80 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1ac90 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61 6d  pager_journalnam
1aca0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1acb0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
1acc0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
1acd0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
1ace0 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
1acf0 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
1ad00 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64 65  e3pager_set_code
1ad10 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
1ad20 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f  er,.  void (*xCo
1ad30 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
1ad40 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
1ad50 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
1ad60 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
1ad70 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
1ad80 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
1ad90 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 0a  = pCodecArg;.}..
1ada0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
1adb0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  ne is called to 
1adc0 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61  increment the da
1add0 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
1ade0 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73  ge-counter,.** s
1adf0 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34  tored at byte 24
1ae00 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69   of the pager fi
1ae10 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
1ae20 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
1ae30 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
1ae40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f 69   *pPager){.  voi
1ae50 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48 64  d *pPage;.  PgHd
1ae60 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32  r *pPgHdr;.  u32
1ae70 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b   change_counter;
1ae80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
1ae90 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20   Open page 1 of 
1aea0 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69  the file for wri
1aeb0 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
1aec0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1aed0 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 61  (pPager, 1, &pPa
1aee0 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ge);.  if( rc!=S
1aef0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1af00 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
1af10 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
1af20 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
1af30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
1af40 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 52  turn rc;..  /* R
1af50 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ead the current 
1af60 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32 34  value at byte 24
1af70 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d 20  . */.  pPgHdr = 
1af80 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 50  DATA_TO_PGHDR(pP
1af90 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f 63  age);.  change_c
1afa0 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65 76  ounter = retriev
1afb0 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c 20  e32bits(pPgHdr, 
1afc0 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  24);..  /* Incre
1afd0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
1afe0 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
1aff0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
1b000 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61 6e  te 24. */.  chan
1b010 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
1b020 73 74 6f 72 65 33 32 62 69 74 73 28 63 68 61 6e  store32bits(chan
1b030 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67 48  ge_counter, pPgH
1b040 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 52  dr, 24);..  /* R
1b050 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20  elease the page 
1b060 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20  reference. */.  
1b070 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
1b080 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74  ef(pPage);.  ret
1b090 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b0a0 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1b0b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
1b0c0 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50 61  or the pager pPa
1b0d0 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69  ger. zMaster poi
1b0e0 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a  nts to the name.
1b0f0 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a  ** of a master j
1b100 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
1b110 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74   should be writt
1b120 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69  en into the indi
1b130 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61  vidual.** journa
1b140 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20  l file. zMaster 
1b150 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69  may be NULL, whi
1b160 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74 65  ch is interprete
1b170 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  d as no master.*
1b180 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e  * journal (a sin
1b190 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
1b1a0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
1b1b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e   This routine en
1b1c0 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20 6a  sures that the j
1b1d0 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
1b1e0 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  , all dirty page
1b1f0 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20  s written.** to 
1b200 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b210 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  e and the databa
1b220 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
1b230 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74  The only thing t
1b240 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74  hat.** remains t
1b250 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
1b260 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64  nsaction is to d
1b270 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
1b280 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61  l file (or.** ma
1b290 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1b2a0 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29 2e  e if specified).
1b2b0 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
1b2c0 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c   if zMaster==NUL
1b2d0 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  L, this does not
1b2e0 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72 65   overwrite a pre
1b2f0 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70  vious value.** p
1b300 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69  assed to an sqli
1b310 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29 20  te3pager_sync() 
1b320 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
1b330 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
1b340 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1b350 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
1b360 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
1b370 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
1b380 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
1b390 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1b3a0 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
1b3b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1b3c0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
1b3d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
1b3e0 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
1b3f0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
1b400 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54 52  SQLITE_OK;..  TR
1b410 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20 53  ACE4("DATABASE S
1b420 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
1b430 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25  ster=%s nTrunc=%
1b440 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61  d\n", .      pPa
1b450 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1b460 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29  zMaster, nTrunc)
1b470 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1b480 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
1b490 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20  db, or no pages 
1b4a0 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
1b4b0 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20  n to, or this.  
1b4c0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  ** function has 
1b4d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c  already been cal
1b4e0 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
1b4f0 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  op..  */.  if( p
1b500 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
1b510 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d  GER_SYNCED && !M
1b520 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
1b530 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20  dirtyCache ){.  
1b540 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
1b550 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b560 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
1b570 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d 61  ..    /* If a ma
1b580 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
1b590 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
1b5a0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1b5b0 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  to the.    ** jo
1b5c0 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e  urnal file, then
1b5d0 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71 75   no sync is requ
1b5e0 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70 65  ired. This happe
1b5f0 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20 20  ns when it is.  
1b600 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74 68    ** written, th
1b610 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 66  en the process f
1b620 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65 20  ails to upgrade 
1b630 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20  from a RESERVED 
1b640 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  to an.    ** EXC
1b650 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65  LUSIVE lock. The
1b660 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20 70   next time the p
1b670 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f 20  rocess tries to 
1b680 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20 2a  commit the.    *
1b690 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  * transaction th
1b6a0 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c 20  e m-j name will 
1b6b0 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
1b6c0 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a  n written..    *
1b6d0 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
1b6e0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b 0a  r->setMaster ){.
1b6f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1b700 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
1b710 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
1b720 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1b730 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1b740 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20 53  _exit;.#ifndef S
1b750 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1b760 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
1b770 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
1b780 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
1b790 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20  transaction has 
1b7a0 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61 73  made the databas
1b7b0 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e 20  e smaller, then 
1b7c0 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20 20  all pages.      
1b7d0 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
1b7e0 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
1b7f0 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
1b800 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1b810 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a  urnal.        **
1b820 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
1b830 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
1b840 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20 2a  ;.        void *
1b850 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 66  pPage;.        f
1b860 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1b870 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1b880 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1b890 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1b8a0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1b8b0 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1b8c0 29 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ))) ){.         
1b8d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1b8e0 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
1b8f0 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20   i, &pPage);.   
1b900 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1b910 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1b920 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1b930 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1b940 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1b950 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1b960 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
1b970 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1b980 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1b990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b9a0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1b9b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b9c0 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
1b9d0 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
1b9e0 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
1b9f0 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
1ba00 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
1ba10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1ba20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1ba30 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
1ba40 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
1ba50 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ba60 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1ba70 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1ba80 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ba90 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1baa0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
1bab0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1bac0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
1bad0 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54  ncate(pPager, nT
1bae0 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28  runc);.      if(
1baf0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1bb00 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1bb10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
1bb20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20     /* Write all 
1bb30 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20 74  dirty pages to t
1bb40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bb50 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
1bb60 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1bb70 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
1bb80 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1bb90 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1bba0 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
1bbb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1bbc0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20 20  o sync_exit;..  
1bbd0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
1bbe0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
1bbf0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
1bc00 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
1bc10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
1bc20 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ync(&pPager->fd)
1bc30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
1bc40 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
1bc50 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
1bc60 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74  sync_exit:.  ret
1bc70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
1bc80 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
1bc90 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
1bca0 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69 64  Move the page id
1bcb0 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61 74  entified by pDat
1bcc0 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67  a to location pg
1bcd0 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20  no in the file. 
1bce0 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73  .**.** There mus
1bcf0 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  t be no referenc
1bd00 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e  es to the curren
1bd10 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20  t page pgno. If 
1bd20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20  current page.** 
1bd30 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
1bd40 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ady in the rollb
1bd50 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20  ack journal, it 
1bd60 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  is not written t
1bd70 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68  here by.** by th
1bd80 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20  is routine. The 
1bd90 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20  same applies to 
1bda0 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20 72  the page pData r
1bdb0 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72  efers to on entr
1bdc0 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75  y to.** this rou
1bdd0 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
1bde0 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
1bdf0 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79  ge refered to by
1be00 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61   pData remain va
1be10 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
1be20 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
1be30 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
1be40 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20  age pData (i.e. 
1be50 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74  data stored in t
1be60 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a  he nExtra bytes.
1be70 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f  ** allocated alo
1be80 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65  ng with the page
1be90 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  ) is the respons
1bea0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
1beb0 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74  aller..**.** A t
1bec0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
1bed0 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74  be active when t
1bee0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
1bef0 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74  alled. It used t
1bf00 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64  o be.** required
1bf10 20 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e   that a statemen
1bf20 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  t transaction wa
1bf30 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75  s not active, bu
1bf40 74 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69  t this restricti
1bf50 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72  on.** has been r
1bf60 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49  emoved (CREATE I
1bf70 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f  NDEX needs to mo
1bf80 76 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61  ve a page when a
1bf90 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72   statement.** tr
1bfa0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
1bfb0 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ive)..*/.int sql
1bfc0 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61  ite3pager_movepa
1bfd0 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ge(Pager *pPager
1bfe0 2c 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50  , void *pData, P
1bff0 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
1c000 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
1c010 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
1c020 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b    PgHdr *pPgOld;
1c030 20 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e   .  int h;.  Pgn
1c040 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
1c050 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
1c060 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20  Pg->nRef>0 );.. 
1c070 20 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64   TRACE5("MOVE %d
1c080 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79   page %d (needSy
1c090 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20  nc=%d) moves to 
1c0a0 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41  %d\n", .      PA
1c0b0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
1c0c0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
1c0d0 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a  eedSync, pgno);.
1c0e0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
1c0f0 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64  Sync ){.    need
1c100 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
1c110 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
1c120 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
1c130 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1c140 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  pPg->dirty );.  
1c150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c160 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
1c170 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70  }..  /* Unlink p
1c180 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  Pg from it's has
1c190 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c  h-chain */.  unl
1c1a0 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
1c1b0 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a  ger, pPg);..  /*
1c1c0 20 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f   If the cache co
1c1d0 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69  ntains a page wi
1c1e0 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70  th page-number p
1c1f0 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20  gno, remove it. 
1c200 20 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61   ** from it's ha
1c210 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20  sh chain. Also, 
1c220 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  if the PgHdr.nee
1c230 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f  dSync was set fo
1c240 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e  r .  ** page pgn
1c250 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f  o before the 'mo
1c260 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69  ve' operation, i
1c270 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  t needs to be re
1c280 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72  tained .  ** for
1c290 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20   the page moved 
1c2a0 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50  there..  */.  pP
1c2b0 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  gOld = pager_loo
1c2c0 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
1c2d0 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20  );.  if( pPgOld 
1c2e0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1c2f0 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  PgOld->nRef==0 )
1c300 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68  ;.    unlinkHash
1c310 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50  Chain(pPager, pP
1c320 67 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f 6c  gOld);.    pPgOl
1c330 64 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  d->dirty = 0;.  
1c340 20 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65    if( pPgOld->ne
1c350 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
1c360 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e  assert( pPgOld->
1c370 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  inJournal );.   
1c380 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
1c390 6c 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67  l = 1;.      pPg
1c3a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1c3b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1c3c0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
1c3d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
1c3e0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
1c3f0 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67  e number for pPg
1c400 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
1c410 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68  nto the new hash
1c420 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50 67  -chain. */.  pPg
1c430 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
1c440 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
1c450 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
1c460 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b  ger->aHash[h] ){
1c470 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c480 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
1c490 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
1c4a0 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
1c4b0 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
1c4c0 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
1c4d0 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61  >pNextHash = pPa
1c4e0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20  ger->aHash[h];. 
1c4f0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1c500 5d 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e  ] = pPg;.  pPg->
1c510 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a  pPrevHash = 0;..
1c520 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
1c530 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74  ;.  pPager->dirt
1c540 79 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69  yCache = 1;..  i
1c550 66 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  f( needSyncPgno 
1c560 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65  ){.    /* If nee
1c570 64 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e  dSyncPgno is non
1c580 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
1c590 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65  journal file nee
1c5a0 64 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a  ds to be .    **
1c5b0 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
1c5c0 20 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69   any data is wri
1c5d0 74 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65  tten to database
1c5e0 20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53   file page needS
1c5f0 79 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20  yncPgno..    ** 
1c600 43 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75  Currently, no su
1c610 63 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69  ch page exists i
1c620 6e 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65  n the page-cache
1c630 20 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a   and the .    **
1c640 20 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61   Pager.aInJourna
1c650 6c 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73  l bit has been s
1c660 65 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74  et. This needs t
1c670 6f 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79  o be remedied by
1c680 20 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20   loading.    ** 
1c690 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68  the page into th
1c6a0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
1c6b0 64 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67  d setting the Pg
1c6c0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
1c6d0 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g..    **.    **
1c6e0 20 54 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   The sqlite3page
1c6f0 72 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79  r_get() call may
1c700 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e   cause the journ
1c710 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d  al to sync. So m
1c720 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20  ake.    ** sure 
1c730 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
1c740 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  nc flag is set t
1c750 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  oo..    */.    i
1c760 6e 74 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20  nt rc;.    void 
1c770 2a 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20  *pNeedSync;.    
1c780 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1c790 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
1c7a0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1c7b0 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65  r_get(pPager, ne
1c7c0 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65  edSyncPgno, &pNe
1c7d0 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28  edSync);.    if(
1c7e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1c7f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1c800 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1c810 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54   = 1;.    DATA_T
1c820 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e  O_PGHDR(pNeedSyn
1c830 63 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  c)->needSync = 1
1c840 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47  ;.    DATA_TO_PG
1c850 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e  HDR(pNeedSync)->
1c860 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1c870 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52     DATA_TO_PGHDR
1c880 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69 72  (pNeedSync)->dir
1c890 74 79 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69  ty = 1;.    sqli
1c8a0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
1c8b0 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a  NeedSync);.  }..
1c8c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c8d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  OK;.}.#endif..#i
1c8e0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1c8f0 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
1c900 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
1c910 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c920 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
1c930 66 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20  f the file lock 
1c940 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61  for the given pa
1c950 67 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  ger..** The retu
1c960 72 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20  rn value is one 
1c970 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52  of NO_LOCK, SHAR
1c980 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45  ED_LOCK, RESERVE
1c990 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49  D_LOCK,.** PENDI
1c9a0 4e 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c  NG_LOCK, or EXCL
1c9b0 55 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69  USIVE_LOCK..*/.i
1c9c0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1c9d0 6c 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20  lockstate(Pager 
1c9e0 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
1c9f0 20 4f 53 5f 54 45 53 54 0a 20 20 72 65 74 75 72   OS_TEST.  retur
1ca00 6e 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64  n pPager->fd->fd
1ca10 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65  .locktype;.#else
1ca20 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1ca30 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23  ->fd.locktype;.#
1ca40 65 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a  endif.}.#endif..
1ca50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1ca60 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
1ca70 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c  a listing of all
1ca80 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
1ca90 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20  s and their ref 
1caa0 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
1cab0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 64  qlite3pager_refd
1cac0 75 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  ump(Pager *pPage
1cad0 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
1cae0 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
1caf0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
1cb00 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
1cb10 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
1cb20 6e 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e  nRef<=0 ) contin
1cb30 75 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  ue;.    sqlite3D
1cb40 65 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45  ebugPrintf("PAGE
1cb50 20 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %3d addr=%p nRe
1cb60 66 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  f=%d\n", .      
1cb70 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44   pPg->pgno, PGHD
1cb80 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
1cb90 70 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a  pPg->nRef);.  }.
1cba0 7d 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66  }.#endif..#endif
1cbb0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1cbc0 44 49 53 4b 49 4f 20 2a 2f 0a                    DISKIO */.