/ Hex Artifact Content
Login

Artifact adbb27f13ac75cd5bc29a3d84803e0cab1edfa88:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 32 31  : pager.c,v 1.21
0350: 35 20 32 30 30 35 2f 30 39 2f 31 37 20 31 35 3a  5 2005/09/17 15:
0360: 32 30 3a 32 37 20 64 72 68 20 45 78 70 20 24 0a  20:27 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28  .#define TRACE1(
0440: 58 29 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  X)       sqlite3
0450: 44 65 62 75 67 50 72 69 6e 74 66 28 58 29 0a 23  DebugPrintf(X).#
0460: 64 65 66 69 6e 65 20 54 52 41 43 45 32 28 58 2c  define TRACE2(X,
0470: 59 29 20 20 20 20 20 73 71 6c 69 74 65 33 44 65  Y)     sqlite3De
0480: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 29 0a 23  bugPrintf(X,Y).#
0490: 64 65 66 69 6e 65 20 54 52 41 43 45 33 28 58 2c  define TRACE3(X,
04a0: 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65  Y,Z)   sqlite3De
04b0: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29  bugPrintf(X,Y,Z)
04c0: 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 34 28  .#define TRACE4(
04d0: 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33  X,Y,Z,W) sqlite3
04e0: 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c  DebugPrintf(X,Y,
04f0: 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41  Z,W).#define TRA
0500: 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73  CE5(X,Y,Z,W,V) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c  f(X,Y,Z,W,V).#el
0530: 73 65 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45  se.#define TRACE
0540: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 54 52 41  1(X).#define TRA
0550: 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69 6e 65  CE2(X,Y).#define
0560: 20 54 52 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23   TRACE3(X,Y,Z).#
0570: 64 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c  define TRACE4(X,
0580: 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 54  Y,Z,W).#define T
0590: 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29  RACE5(X,Y,Z,W,V)
05a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
05b0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f  he following two
05c0: 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65 64   macros are used
05d0: 20 77 69 74 68 69 6e 20 74 68 65 20 54 52 41 43   within the TRAC
05e0: 45 58 28 29 20 6d 61 63 72 6f 73 20 61 62 6f 76  EX() macros abov
05f0: 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75  e.** to print ou
0600: 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f  t file-descripto
0610: 72 73 2e 20 54 68 65 79 20 61 72 65 20 72 65 71  rs. They are req
0620: 75 69 72 65 64 20 73 6f 20 74 68 61 74 20 74 72  uired so that tr
0630: 61 63 69 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20  acing.** can be 
0640: 74 75 72 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75  turned on when u
0650: 73 69 6e 67 20 62 6f 74 68 20 74 68 65 20 72 65  sing both the re
0660: 67 75 6c 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20  gular os_unix.c 
0670: 61 6e 64 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a  and os_test.c.**
0680: 20 62 61 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a   backends..**.**
0690: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
06a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
06b0: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
06c0: 69 74 27 73 20 61 72 67 75 6d 65 6e 74 2e 20 54  it's argument. T
06d0: 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64  he.** associated
06e0: 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72   file-descriptor
06f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49   is returned. FI
0700: 4c 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b  LEHANDLEID() tak
0710: 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20  es an OsFile.** 
0720: 73 74 72 75 63 74 20 61 73 20 69 74 27 73 20 61  struct as it's a
0730: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64  rgument..*/.#ifd
0740: 65 66 20 4f 53 5f 54 45 53 54 0a 23 64 65 66 69  ef OS_TEST.#defi
0750: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 70  ne PAGERID(p) (p
0760: 2d 3e 66 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66  ->fd->fd.h).#def
0770: 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  ine FILEHANDLEID
0780: 28 66 64 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a  (fd) (fd->fd.h).
0790: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 50 41  #else.#define PA
07a0: 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66 64 2e  GERID(p) (p->fd.
07b0: 68 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48  h).#define FILEH
07c0: 41 4e 44 4c 45 49 44 28 66 64 29 20 28 66 64 2e  ANDLEID(fd) (fd.
07d0: 68 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  h).#endif../*.**
07e0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
07f0: 61 73 20 61 20 77 68 6f 6c 65 20 69 73 20 61 6c  as a whole is al
0800: 77 61 79 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74  ways in one of t
0810: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20  he following.** 
0820: 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  states:.**.**   
0830: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20  PAGER_UNLOCK    
0840: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0850: 68 65 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  he is not curren
0860: 74 6c 79 20 72 65 61 64 69 6e 67 20 6f 72 20 0a  tly reading or .
0870: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0880: 20 20 20 20 20 20 20 20 20 77 72 69 74 69 6e 67           writing
0890: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
08a0: 6c 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e 6f  le.  There is no
08b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08c0: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20 68            data h
08d0: 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20  eld in memory.  
08e0: 54 68 69 73 20 69 73 20 74 68 65 20 69 6e 69 74  This is the init
08f0: 69 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ial.**          
0900: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
0910: 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45  te..**.**   PAGE
0920: 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 20 20  R_SHARED        
0930: 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  The page cache i
0940: 73 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  s reading the da
0950: 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20  tabase..**      
0960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0970: 20 57 72 69 74 69 6e 67 20 69 73 20 6e 6f 74 20   Writing is not 
0980: 70 65 72 6d 69 74 74 65 64 2e 20 20 54 68 65 72  permitted.  Ther
0990: 65 20 63 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20  e can be.**     
09a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09b0: 20 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65    multiple reade
09c0: 72 73 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  rs accessing the
09d0: 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 0a 2a   same database.*
09e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
09f0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 61 74 20          file at 
0a00: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a  the same time..*
0a10: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53  *.**   PAGER_RES
0a20: 45 52 56 45 44 20 20 20 20 20 20 54 68 69 73 20  ERVED      This 
0a30: 70 72 6f 63 65 73 73 20 68 61 73 20 72 65 73 65  process has rese
0a40: 72 76 65 64 20 74 68 65 20 64 61 74 61 62 61 73  rved the databas
0a50: 65 20 66 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a  e for writing.**
0a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a70: 20 20 20 20 20 20 20 62 75 74 20 68 61 73 20 6e         but has n
0a80: 6f 74 20 79 65 74 20 6d 61 64 65 20 61 6e 79 20  ot yet made any 
0a90: 63 68 61 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f  changes.  Only o
0aa0: 6e 65 20 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20  ne process.**   
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 20 20 20 20 61 74 20 61 20 74 69 6d 65 20 63 61      at a time ca
0ad0: 6e 20 72 65 73 65 72 76 65 20 74 68 65 20 64 61  n reserve the da
0ae0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 6f 72 69  tabase.  The ori
0af0: 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  ginal.**        
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
0b10: 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
0b20: 20 6e 6f 74 20 62 65 65 6e 20 6d 6f 64 69 66 69   not been modifi
0b30: 65 64 20 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20  ed so other.**  
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 20 20 20 20 70 72 6f 63 65 73 73 65 73 20 6d       processes m
0b60: 61 79 20 73 74 69 6c 6c 20 62 65 20 72 65 61 64  ay still be read
0b70: 69 6e 67 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a  ing the on-disk.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  e file..**.**   
0bb0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
0bc0: 20 20 20 20 54 68 65 20 70 61 67 65 20 63 61 63      The page cac
0bd0: 68 65 20 69 73 20 77 72 69 74 69 6e 67 20 74 68  he is writing th
0be0: 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20  e database..**  
0bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c00: 20 20 20 20 20 41 63 63 65 73 73 20 69 73 20 65       Access is e
0c10: 78 63 6c 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74  xclusive.  No ot
0c20: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 6f 72  her processes or
0c30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0c40: 20 20 20 20 20 20 20 20 20 20 74 68 72 65 61 64            thread
0c50: 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67  s can be reading
0c60: 20 6f 72 20 77 72 69 74 69 6e 67 20 77 68 69 6c   or writing whil
0c70: 65 20 6f 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20  e one.**        
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0c90: 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69 6e  rocess is writin
0ca0: 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  g..**.**   PAGER
0cb0: 5f 53 59 4e 43 45 44 20 20 20 20 20 20 20 20 54  _SYNCED        T
0cc0: 68 65 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74  he pager moves t
0cd0: 6f 20 74 68 69 73 20 73 74 61 74 65 20 66 72 6f  o this state fro
0ce0: 6d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  m PAGER_EXCLUSIV
0cf0: 45 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  E.**            
0d00: 20 20 20 20 20 20 20 20 20 20 20 61 66 74 65 72             after
0d10: 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
0d20: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0d30: 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20  en to the.**    
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0d60: 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61   and the file ha
0d70: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
0d80: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 2e 20            disk. 
0da0: 41 6c 6c 20 74 68 61 74 20 72 65 6d 61 69 6e 73  All that remains
0db0: 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 72 65 6d   to do is to rem
0dc0: 6f 76 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ove the.**      
0dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0de0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
0df0: 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
0e00: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20  n will be.**    
0e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e20: 20 20 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a     committed..**
0e30: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 63 61 63  .** The page cac
0e40: 68 65 20 63 6f 6d 65 73 20 75 70 20 69 6e 20 50  he comes up in P
0e50: 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68  AGER_UNLOCK.  Th
0e60: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 0a 2a  e first time a.*
0e70: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  * sqlite3pager_g
0e80: 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74 68 65  et() occurs, the
0e90: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0ea0: 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ns to PAGER_SHAR
0eb0: 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c  ED..** After all
0ec0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0ed0: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
0ee0: 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e 72 65  sqlite_page_unre
0ef0: 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74  f(),.** the stat
0f00: 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 61  e transitions ba
0f10: 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f  ck to PAGER_UNLO
0f20: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0f30: 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69  ime.** that sqli
0f40: 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
0f50: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
0f60: 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e  state transition
0f70: 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45  s to.** PAGER_RE
0f80: 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20 74  SERVED.  (Note t
0f90: 68 61 74 20 73 71 6c 69 74 65 5f 70 61 67 65 5f  hat sqlite_page_
0fa0: 77 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79  write() can only
0fb0: 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e   be.** called on
0fc0: 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   an outstanding 
0fd0: 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e 73  page which means
0fe0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
0ff0: 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41  must.** be in PA
1000: 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f 72  GER_SHARED befor
1010: 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e 73  e it transitions
1020: 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52 56   to PAGER_RESERV
1030: 45 44 2e 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e  ED.).** The tran
1040: 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f  sition to PAGER_
1050: 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72 73  EXCLUSIVE occurs
1060: 20 77 68 65 6e 20 62 65 66 6f 72 65 20 61 6e 79   when before any
1070: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1080: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1090: 62 61 73 65 20 66 69 6c 65 2e 20 20 41 66 74 65  base file.  Afte
10a0: 72 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  r an sqlite3page
10b0: 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20  r_rollback().** 
10c0: 6f 72 20 73 71 6c 69 74 65 5f 70 61 67 65 72 5f  or sqlite_pager_
10d0: 63 6f 6d 6d 69 74 28 29 2c 20 74 68 65 20 73 74  commit(), the st
10e0: 61 74 65 20 67 6f 65 73 20 62 61 63 6b 20 74 6f  ate goes back to
10f0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a   PAGER_SHARED..*
1100: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1110: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 30 0a 23 64  UNLOCK      0.#d
1120: 65 66 69 6e 65 20 50 41 47 45 52 5f 53 48 41 52  efine PAGER_SHAR
1130: 45 44 20 20 20 20 20 20 31 20 20 20 2f 2a 20 73  ED      1   /* s
1140: 61 6d 65 20 61 73 20 53 48 41 52 45 44 5f 4c 4f  ame as SHARED_LO
1150: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1160: 47 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20  GER_RESERVED    
1170: 32 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 52  2   /* same as R
1180: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a  ESERVED_LOCK */.
1190: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 58  #define PAGER_EX
11a0: 43 4c 55 53 49 56 45 20 20 20 34 20 20 20 2f 2a  CLUSIVE   4   /*
11b0: 20 73 61 6d 65 20 61 73 20 45 58 43 4c 55 53 49   same as EXCLUSI
11c0: 56 45 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  VE_LOCK */.#defi
11d0: 6e 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20  ne PAGER_SYNCED 
11e0: 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66       5../*.** If
11f0: 20 74 68 65 20 53 51 4c 49 54 45 5f 42 55 53 59   the SQLITE_BUSY
1200: 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d  _RESERVED_LOCK m
1210: 61 63 72 6f 20 69 73 20 73 65 74 20 74 6f 20 74  acro is set to t
1220: 72 75 65 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  rue at compile-t
1230: 69 6d 65 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69  ime,.** then fai
1240: 6c 65 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20  led attempts to 
1250: 67 65 74 20 61 20 72 65 73 65 72 76 65 64 20 6c  get a reserved l
1260: 6f 63 6b 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20  ock will invoke 
1270: 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  the busy callbac
1280: 6b 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 6f 66  k..** This is of
1290: 66 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 54  f by default.  T
12a0: 6f 20 73 65 65 20 77 68 79 2c 20 63 6f 6e 73 69  o see why, consi
12b0: 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
12c0: 67 20 73 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a  g scenario:.** .
12d0: 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 72 65 61  ** Suppose threa
12e0: 64 20 41 20 61 6c 72 65 61 64 79 20 68 61 73 20  d A already has 
12f0: 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e  a shared lock an
1300: 64 20 77 61 6e 74 73 20 61 20 72 65 73 65 72 76  d wants a reserv
1310: 65 64 20 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65  ed lock..** Thre
1320: 61 64 20 42 20 61 6c 72 65 61 64 79 20 68 61 73  ad B already has
1330: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1340: 20 61 6e 64 20 77 61 6e 74 73 20 61 6e 20 65 78   and wants an ex
1350: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49  clusive lock.  I
1360: 66 0a 2a 2a 20 62 6f 74 68 20 74 68 72 65 61 64  f.** both thread
1370: 73 20 61 72 65 20 75 73 69 6e 67 20 74 68 65 69  s are using thei
1380: 72 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 73  r busy callbacks
1390: 2c 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20  , it might be a 
13a0: 6c 6f 6e 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20  long time.** be 
13b0: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74  for one of the t
13c0: 68 72 65 61 64 73 20 67 69 76 65 20 75 70 20 61  hreads give up a
13d0: 6e 64 20 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74  nd allows the ot
13e0: 68 65 72 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a  her to proceed..
13f0: 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 74 68  ** But if the th
1400: 72 65 61 64 20 74 72 79 69 6e 67 20 74 6f 20 67  read trying to g
1410: 65 74 20 74 68 65 20 72 65 73 65 72 76 65 64 20  et the reserved 
1420: 6c 6f 63 6b 20 67 69 76 65 73 20 75 70 20 71 75  lock gives up qu
1430: 69 63 6b 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20  ickly.** (if it 
1440: 6e 65 76 65 72 20 69 6e 76 6f 6b 65 73 20 69 74  never invokes it
1450: 73 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 29  s busy callback)
1460: 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   then the conten
1470: 74 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  tion will be.** 
1480: 72 65 73 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79  resolved quickly
1490: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
14a0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14b0: 44 5f 4c 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20  D_LOCK.# define 
14c0: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
14d0: 52 56 45 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64  RVED_LOCK 0.#end
14e0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d  if../*.** This m
14f0: 61 63 72 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75  acro rounds valu
1500: 65 73 20 75 70 20 73 6f 20 74 68 61 74 20 69 66  es up so that if
1510: 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e   the value is an
1520: 20 61 64 64 72 65 73 73 20 69 74 0a 2a 2a 20 69   address it.** i
1530: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
1540: 62 65 20 61 6e 20 61 64 64 72 65 73 73 20 74 68  be an address th
1550: 61 74 20 69 73 20 61 6c 69 67 6e 65 64 20 74 6f  at is aligned to
1560: 20 61 6e 20 38 2d 62 79 74 65 20 62 6f 75 6e 64   an 8-byte bound
1570: 61 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ary..*/.#define 
1580: 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
1590: 58 29 20 20 20 28 28 28 58 29 2b 37 29 26 7e 37  X)   (((X)+7)&~7
15a0: 29 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e  )../*.** Each in
15b0: 2d 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66  -memory image of
15c0: 20 61 20 70 61 67 65 20 62 65 67 69 6e 73 20 77   a page begins w
15d0: 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
15e0: 67 20 68 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69  g header..** Thi
15f0: 73 20 68 65 61 64 65 72 20 69 73 20 6f 6e 6c 79  s header is only
1600: 20 76 69 73 69 62 6c 65 20 74 6f 20 74 68 69 73   visible to this
1610: 20 70 61 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20   pager module.  
1620: 54 68 65 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f  The client.** co
1630: 64 65 20 74 68 61 74 20 63 61 6c 6c 73 20 70 61  de that calls pa
1640: 67 65 72 20 73 65 65 73 20 6f 6e 6c 79 20 74 68  ger sees only th
1650: 65 20 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c  e data that foll
1660: 6f 77 73 20 74 68 65 20 68 65 61 64 65 72 2e 0a  ows the header..
1670: 2a 2a 0a 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64  **.** Client cod
1680: 65 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71  e should call sq
1690: 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
16a0: 28 29 20 6f 6e 20 61 20 70 61 67 65 20 70 72 69  () on a page pri
16b0: 6f 72 20 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20  or to making.** 
16c0: 61 6e 79 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  any modification
16d0: 73 20 74 6f 20 74 68 61 74 20 70 61 67 65 2e 20  s to that page. 
16e0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
16f0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
1700: 74 65 28 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  te().** is calle
1710: 64 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  d, the original 
1720: 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
1730: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
1740: 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a  he rollback.** j
1750: 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64 72  ournal and PgHdr
1760: 2e 69 6e 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50  .inJournal and P
1770: 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 61 72  gHdr.needSync ar
1780: 65 20 73 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f  e set.  Later, o
1790: 6e 63 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  nce.** the journ
17a0: 61 6c 20 70 61 67 65 20 68 61 73 20 6d 61 64 65  al page has made
17b0: 20 69 74 20 6f 6e 74 6f 20 74 68 65 20 64 69 73   it onto the dis
17c0: 6b 20 73 75 72 66 61 63 65 2c 20 50 67 48 64 72  k surface, PgHdr
17d0: 2e 6e 65 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20  .needSync.** is 
17e0: 63 6c 65 61 72 65 64 2e 20 20 54 68 65 20 6d 6f  cleared.  The mo
17f0: 64 69 66 69 65 64 20 70 61 67 65 20 63 61 6e 6e  dified page cann
1800: 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 61  ot be written ba
1810: 63 6b 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67  ck into the orig
1820: 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65  inal.** database
1830: 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
1840: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 73 20 68 61  journal pages ha
1850: 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f  s been synced to
1860: 20 64 69 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a   disk and the.**
1870: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
1880: 68 61 73 20 62 65 65 6e 20 63 6c 65 61 72 65 64  has been cleared
1890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64  ..**.** The PgHd
18a0: 72 2e 64 69 72 74 79 20 66 6c 61 67 20 69 73 20  r.dirty flag is 
18b0: 73 65 74 20 77 68 65 6e 20 73 71 6c 69 74 65 33  set when sqlite3
18c0: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
18d0: 20 63 61 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69   called and.** i
18e0: 73 20 63 6c 65 61 72 65 64 20 61 67 61 69 6e 20  s cleared again 
18f0: 77 68 65 6e 20 74 68 65 20 70 61 67 65 20 63 6f  when the page co
1900: 6e 74 65 6e 74 20 69 73 20 77 72 69 74 74 65 6e  ntent is written
1910: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 6f 72 69   back to the ori
1920: 67 69 6e 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73  ginal.** databas
1930: 65 20 66 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64  e file..*/.typed
1940: 65 66 20 73 74 72 75 63 74 20 50 67 48 64 72 20  ef struct PgHdr 
1950: 50 67 48 64 72 3b 0a 73 74 72 75 63 74 20 50 67  PgHdr;.struct Pg
1960: 48 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70  Hdr {.  Pager *p
1970: 50 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20  Pager;          
1980: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
1990: 67 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69  ger to which thi
19a0: 73 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a  s page belongs *
19b0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e     /* The page n
19e0: 75 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70  umber for this p
19f0: 61 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  age */.  PgHdr *
1a00: 70 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65  pNextHash, *pPre
1a10: 76 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20  vHash;  /* Hash 
1a20: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20  collision chain 
1a30: 66 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a  for PgHdr.pgno *
1a40: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
1a50: 46 72 65 65 2c 20 2a 70 50 72 65 76 46 72 65 65  Free, *pPrevFree
1a60: 3b 20 20 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f  ;  /* Freelist o
1a70: 66 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  f pages where nR
1a80: 65 66 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72  ef==0 */.  PgHdr
1a90: 20 2a 70 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20   *pNextAll;     
1aa0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 6c            /* A l
1ab0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
1ac0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
1ad0: 78 74 53 74 6d 74 2c 20 2a 70 50 72 65 76 53 74  xtStmt, *pPrevSt
1ae0: 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  mt;  /* List of 
1af0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
1b00: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a  tement journal *
1b10: 2f 0a 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c  /.  u8 inJournal
1b20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b30: 20 20 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61     /* TRUE if ha
1b40: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
1b50: 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  o journal */.  u
1b60: 38 20 69 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  8 inStmt;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b80: 20 54 52 55 45 20 69 66 20 69 6e 20 74 68 65 20   TRUE if in the 
1b90: 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75  statement subjou
1ba0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
1bb0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45           /* TRUE
1bd0: 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77   if we need to w
1be0: 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65  rite back change
1bf0: 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79  s */.  u8 needSy
1c00: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
1c10: 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f        /* Sync jo
1c20: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69  urnal before wri
1c30: 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a  ting this page *
1c40: 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c  /.  u8 alwaysRol
1c50: 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20  lback;          
1c60: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f     /* Disable do
1c70: 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  nt_rollback() fo
1c80: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
1c90: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
1cc0: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
1cd0: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
1ce0: 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ty;             
1cf0: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
1d00: 65 73 20 73 6f 72 74 65 64 20 62 79 20 50 67 48  es sorted by PgH
1d10: 64 72 2e 70 67 6e 6f 20 2a 2f 0a 23 69 66 64 65  dr.pgno */.#ifde
1d20: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1d30: 41 47 45 53 0a 20 20 75 33 32 20 70 61 67 65 48  AGES.  u32 pageH
1d40: 61 73 68 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  ash;.#endif.  /*
1d50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1d60: 65 20 62 79 74 65 73 20 6f 66 20 70 61 67 65 20  e bytes of page 
1d70: 64 61 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73  data follow this
1d80: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20   header */.  /* 
1d90: 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
1da0: 65 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61  es of local data
1db0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65   follow the page
1dc0: 20 64 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   data */.};../*.
1dd0: 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d  ** For an in-mem
1de0: 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73  ory only databas
1df0: 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e  e, some extra in
1e00: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63  formation is rec
1e10: 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65  orded about.** e
1e20: 61 63 68 20 70 61 67 65 20 73 6f 20 74 68 61 74  ach page so that
1e30: 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20   changes can be 
1e40: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a  rolled back.  (J
1e50: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65  ournal files are
1e60: 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72   not.** used for
1e70: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
1e80: 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c  ases.)  The foll
1e90: 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  owing informatio
1ea0: 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a  n is added to.**
1eb0: 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72   the end of ever
1ec0: 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f  y EXTRA block fo
1ed0: 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  r in-memory data
1ee0: 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  bases..**.** Thi
1ef0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f  s information co
1f00: 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 61 64  uld have been ad
1f10: 64 65 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20  ded directly to 
1f20: 74 68 65 20 50 67 48 64 72 20 73 74 72 75 63 74  the PgHdr struct
1f30: 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e  ure..** But then
1f40: 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75   it would take u
1f50: 70 20 61 6e 20 65 78 74 72 61 20 38 20 62 79 74  p an extra 8 byt
1f60: 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e  es of storage on
1f70: 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20   every PgHdr.** 
1f80: 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61  even for disk-ba
1f90: 73 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 20  sed databases.  
1fa0: 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74  Splitting it out
1fb0: 20 73 61 76 65 73 20 38 20 62 79 74 65 73 2e 20   saves 8 bytes. 
1fc0: 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79   This.** is only
1fd0: 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e   a savings of 0.
1fe0: 38 25 20 62 75 74 20 74 68 6f 73 65 20 70 65 72  8% but those per
1ff0: 63 65 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e  centages add up.
2000: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2010: 63 74 20 50 67 48 69 73 74 6f 72 79 20 50 67 48  ct PgHistory PgH
2020: 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50  istory;.struct P
2030: 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20  gHistory {.  u8 
2040: 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f  *pOrig;     /* O
2050: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78  riginal page tex
2060: 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74  t.  Restore to t
2070: 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f  his on a full ro
2080: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a  llback */.  u8 *
2090: 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65  pStmt;     /* Te
20a0: 78 74 20 61 73 20 69 74 20 77 61 73 20 61 74 20  xt as it was at 
20b0: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
20c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
20d0: 74 65 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  tement */.};../*
20e0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
20f0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
2100: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
2110: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
2120: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
2130: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
2140: 43 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50  C(P,D,N,X) if( P
2150: 2d 3e 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78  ->xCodec ){ P->x
2160: 43 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41  Codec(P->pCodecA
2170: 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c  rg,D,N,X); }.#el
2180: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
2190: 43 28 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69  C(P,D,N,X).#endi
21a0: 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  f../*.** Convert
21b0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
21c0: 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69  PgHdr into a poi
21d0: 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74 61  nter to its data
21e0: 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61  .** and back aga
21f0: 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  in..*/.#define P
2200: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20  GHDR_TO_DATA(P) 
2210: 20 28 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31   ((void*)(&(P)[1
2220: 5d 29 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41  ])).#define DATA
2230: 5f 54 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26  _TO_PGHDR(D)  (&
2240: 28 28 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31  ((PgHdr*)(D))[-1
2250: 5d 29 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  ]).#define PGHDR
2260: 5f 54 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28  _TO_EXTRA(G,P) (
2270: 28 76 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29  (void*)&((char*)
2280: 28 26 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e  (&(G)[1]))[(P)->
2290: 70 61 67 65 53 69 7a 65 5d 29 0a 23 64 65 66 69  pageSize]).#defi
22a0: 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ne PGHDR_TO_HIST
22b0: 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20  (P,PGR)  \.     
22c0: 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f         ((PgHisto
22d0: 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  ry*)&((char*)(&(
22e0: 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70  P)[1]))[(PGR)->p
22f0: 61 67 65 53 69 7a 65 2b 28 50 47 52 29 2d 3e 6e  ageSize+(PGR)->n
2300: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48  Extra])../*.** H
2310: 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74  ow big to make t
2320: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73  he hash table us
2330: 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  ed for locating 
2340: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a  in-memory pages.
2350: 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ** by page numbe
2360: 72 2e 20 54 68 69 73 20 6d 61 63 72 6f 20 6c 6f  r. This macro lo
2370: 6f 6b 73 20 61 20 6c 69 74 74 6c 65 20 73 69 6c  oks a little sil
2380: 6c 79 2c 20 62 75 74 20 69 73 20 65 76 61 6c 75  ly, but is evalu
2390: 61 74 65 64 0a 2a 2a 20 61 74 20 63 6f 6d 70 69  ated.** at compi
23a0: 6c 65 2d 74 69 6d 65 2c 20 6e 6f 74 20 72 75 6e  le-time, not run
23b0: 2d 74 69 6d 65 20 28 61 74 20 6c 65 61 73 74 20  -time (at least 
23c0: 66 6f 72 20 67 63 63 20 74 68 69 73 20 69 73 20  for gcc this is 
23d0: 74 72 75 65 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e  true)..*/.#defin
23e0: 65 20 4e 5f 50 47 5f 48 41 53 48 20 28 5c 0a 20  e N_PG_HASH (\. 
23f0: 20 28 4d 41 58 5f 50 41 47 45 53 3e 31 30 32 34   (MAX_PAGES>1024
2400: 29 3f 32 30 34 38 3a 20 5c 0a 20 20 28 4d 41 58  )?2048: \.  (MAX
2410: 5f 50 41 47 45 53 3e 35 31 32 29 3f 31 30 32 34  _PAGES>512)?1024
2420: 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47 45 53  : \.  (MAX_PAGES
2430: 3e 32 35 36 29 3f 35 31 32 3a 20 5c 0a 20 20 28  >256)?512: \.  (
2440: 4d 41 58 5f 50 41 47 45 53 3e 31 32 38 29 3f 32  MAX_PAGES>128)?2
2450: 35 36 3a 20 5c 0a 20 20 28 4d 41 58 5f 50 41 47  56: \.  (MAX_PAG
2460: 45 53 3e 36 34 29 3f 31 32 38 3a 36 34 20 5c 0a  ES>64)?128:64 \.
2470: 29 0a 0a 2f 2a 0a 2a 2a 20 48 61 73 68 20 61 20  )../*.** Hash a 
2480: 70 61 67 65 20 6e 75 6d 62 65 72 0a 2a 2f 0a 23  page number.*/.#
2490: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 68 61 73  define pager_has
24a0: 68 28 50 4e 29 20 20 28 28 50 4e 29 26 28 4e 5f  h(PN)  ((PN)&(N_
24b0: 50 47 5f 48 41 53 48 2d 31 29 29 0a 0a 2f 2a 0a  PG_HASH-1))../*.
24c0: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
24d0: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
24e0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
24f0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
2500: 2a 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20  */.struct Pager 
2510: 7b 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70  {.  u8 journalOp
2520: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
2530: 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e  /* True if journ
2540: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
2550: 6f 72 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a  ors is valid */.
2560: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72    u8 journalStar
2570: 74 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ted;          /*
2580: 20 54 72 75 65 20 69 66 20 68 65 61 64 65 72 20   True if header 
2590: 6f 66 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79  of journal is sy
25a0: 6e 63 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65  nced */.  u8 use
25b0: 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20  Journal;        
25c0: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72        /* Use a r
25d0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
25e0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
25f0: 20 20 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b    u8 noReadlock;
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2610: 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74   Do not bother t
2620: 6f 20 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63  o obtain readloc
2630: 6b 73 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f  ks */.  u8 stmtO
2640: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2650: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74      /* True if t
2660: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
2670: 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20  journal is open 
2680: 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73  */.  u8 stmtInUs
2690: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
26a0: 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65 20   /* True we are 
26b0: 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73  in a statement s
26c0: 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f  ubtransaction */
26d0: 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70  .  u8 stmtAutoop
26e0: 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  en;            /
26f0: 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72  * Open stmt jour
2700: 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f  nal when main jo
2710: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a  urnal is opened*
2720: 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20  /.  u8 noSync;  
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74  /* Do not sync t
2750: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72  he journal if tr
2760: 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53  ue */.  u8 fullS
2770: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2780: 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20      /* Do extra 
2790: 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75  syncs of the jou
27a0: 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e  rnal for robustn
27b0: 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  ess */.  u8 stat
27c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27d0: 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e       /* PAGER_UN
27e0: 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f  LOCK, _SHARED, _
27f0: 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a  RESERVED, etc. *
2800: 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b 20  /.  u8 errMask; 
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61  /* One of severa
2830: 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72  l kinds of error
2840: 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69  s */.  u8 tempFi
2850: 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2860: 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20     /* zFilename 
2870: 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2880: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64  ile */.  u8 read
2890: 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20  Only;           
28a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
28b0: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
28c0: 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65  abase */.  u8 ne
28d0: 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  edSync;         
28e0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
28f0: 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20  f an fsync() is 
2900: 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f  needed on the jo
2910: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
2920: 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20  rtyCache;       
2930: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2940: 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68  f cached pages h
2950: 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ave changed */. 
2960: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
2970: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ck;          /* 
2980: 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f 6c  Disable dont_rol
2990: 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20  lback() for all 
29a0: 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65  pages */.  u8 me
29b0: 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  mDb;            
29c0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
29d0: 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69  o inhibit all fi
29e0: 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73  le I/O */.  u8 s
29f0: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2a00: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2a10: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2a20: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2a30: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 69 6e 74 20  o jrnl */.  int 
2a40: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
2a50: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a60: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
2a70: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2a80: 6f 72 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20  origDbSize;     
2a90: 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a          /* dbSiz
2aa0: 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75 72  e before the cur
2ab0: 72 65 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20  rent change */. 
2ac0: 20 69 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20   int stmtSize;  
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ae0: 53 69 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65  Size of database
2af0: 20 28 69 6e 20 70 61 67 65 73 29 20 61 74 20 73   (in pages) at s
2b00: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
2b10: 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20   int nRec;      
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b30: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
2b40: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
2b50: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
2b60: 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20  cksumInit;      
2b70: 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69          /* Quasi
2b80: 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64  -random value ad
2b90: 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68 65  ded to every che
2ba0: 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73  cksum */.  int s
2bb0: 74 6d 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20  tmtNRec;        
2bc0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2bd0: 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73   of records in s
2be0: 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a  tmt subjournal *
2bf0: 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20  /.  int nExtra; 
2c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c10: 2f 2a 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79  /* Add this many
2c20: 20 62 79 74 65 73 20 74 6f 20 65 61 63 68 20 69   bytes to each i
2c30: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f  n-memory page */
2c40: 0a 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b  .  int pageSize;
2c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c60: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2c70: 73 20 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20  s in a page */. 
2c80: 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20   int nPage;     
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca0: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
2cb0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
2cc0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 50 61 67  */.  int nMaxPag
2cd0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2ce0: 20 2f 2a 20 48 69 67 68 20 77 61 74 65 72 20 6d   /* High water m
2cf0: 61 72 6b 20 6f 66 20 6e 50 61 67 65 20 2a 2f 0a  ark of nPage */.
2d00: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
2d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d20: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   Number of in-me
2d30: 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68 20  mory pages with 
2d40: 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a  PgHdr.nRef>0 */.
2d50: 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20 20    int mxPage;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d70: 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   Maximum number 
2d80: 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c 64  of pages to hold
2d90: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 75   in cache */.  u
2da0: 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20  8 *aInJournal;  
2db0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
2dc0: 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70  e bit for each p
2dd0: 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
2de0: 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ase file */.  u8
2df0: 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20   *aInStmt;      
2e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
2e10: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
2e20: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2e30: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  se */.  char *zF
2e40: 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20  ilename;        
2e50: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
2e60: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2e70: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75   */.  char *zJou
2e80: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  rnal;           
2e90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2ea0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
2eb0: 0a 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74  .  char *zDirect
2ec0: 6f 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ory;           /
2ed0: 2a 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64  * Directory hold
2ee0: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f   database and jo
2ef0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20  urnal files */. 
2f00: 20 4f 73 46 69 6c 65 20 66 64 2c 20 6a 66 64 3b   OsFile fd, jfd;
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f20: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  File descriptors
2f30: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e   for database an
2f40: 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f  d journal */.  O
2f50: 73 46 69 6c 65 20 73 74 66 64 3b 20 20 20 20 20  sFile stfd;     
2f60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2f70: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
2f80: 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  r the statement 
2f90: 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42  subjournal*/.  B
2fa0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73  usyHandler *pBus
2fb0: 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f  yHandler;  /* Po
2fc0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e  inter to sqlite.
2fd0: 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20  busyHandler */. 
2fe0: 20 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20   PgHdr *pFirst, 
2ff0: 2a 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20  *pLast;      /* 
3000: 4c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67  List of free pag
3010: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
3020: 46 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20  FirstSynced;    
3030: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65      /* First fre
3040: 65 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64  e page with PgHd
3050: 72 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f  r.needSync==0 */
3060: 0a 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20  .  PgHdr *pAll; 
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3080: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  * List of all pa
3090: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
30a0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
30b0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
30c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61  pages in the sta
30d0: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
30e0: 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e  l */.  i64 journ
30f0: 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  alOff;          
3100: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79     /* Current by
3110: 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65  te offset in the
3120: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
3130: 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64  .  i64 journalHd
3140: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  r;             /
3150: 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f  * Byte offset to
3160: 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61   previous journa
3170: 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  l header */.  i6
3180: 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20  4 stmtHdrOff;   
3190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
31a0: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
31b0: 72 20 77 72 69 74 74 65 6e 20 74 68 69 73 20 73  r written this s
31c0: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36  tatement */.  i6
31d0: 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20  4 stmtCksum;    
31e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73            /* cks
31f0: 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74  umInit when stat
3200: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
3210: 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 4a  d */.  i64 stmtJ
3220: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3230: 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6a 6f     /* Size of jo
3240: 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f 62 65  urnal at stmt_be
3250: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 73  gin() */.  int s
3260: 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20 20 20  ectorSize;      
3270: 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75 6d 65         /* Assume
3280: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 64 75  d sector size du
3290: 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f  ring rollback */
32a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
32b0: 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20  EST.  int nHit, 
32c0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
32d0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
32e0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
32f0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
3300: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
3310: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3320: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
3330: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23  ead/written */.#
3340: 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78  endif.  void (*x
3350: 44 65 73 74 72 75 63 74 6f 72 29 28 76 6f 69 64  Destructor)(void
3360: 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20  *,int); /* Call 
3370: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
3380: 6e 20 66 72 65 65 69 6e 67 20 70 61 67 65 73 20  n freeing pages 
3390: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 52 65 69  */.  void (*xRei
33a0: 6e 69 74 65 72 29 28 76 6f 69 64 2a 2c 69 6e 74  niter)(void*,int
33b0: 29 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69  );   /* Call thi
33c0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72  s routine when r
33d0: 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a  eloading pages *
33e0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65  /.  void (*xCode
33f0: 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50  c)(void*,void*,P
3400: 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75  gno,int); /* Rou
3410: 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f  tine for en/deco
3420: 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76  ding data */.  v
3430: 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20  oid *pCodecArg; 
3440: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3450: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
3460: 78 43 6f 64 65 63 28 29 20 2a 2f 0a 20 20 50 67  xCodec() */.  Pg
3470: 48 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f  Hdr *aHash[N_PG_
3480: 48 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73  HASH];    /* Has
3490: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
34a0: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
34b0: 48 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Hdr */.};../*.**
34c0: 20 49 66 20 53 51 4c 49 54 45 5f 54 45 53 54 20   If SQLITE_TEST 
34d0: 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e 20  is defined then 
34e0: 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  increment the va
34f0: 72 69 61 62 6c 65 20 67 69 76 65 6e 20 69 6e 0a  riable given in.
3500: 2a 2a 20 74 68 65 20 61 72 67 75 6d 65 6e 74 0a  ** the argument.
3510: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3520: 5f 54 45 53 54 0a 23 20 64 65 66 69 6e 65 20 54  _TEST.# define T
3530: 45 53 54 5f 49 4e 43 52 28 78 29 20 20 78 2b 2b  EST_INCR(x)  x++
3540: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3550: 54 45 53 54 5f 49 4e 43 52 28 78 29 0a 23 65 6e  TEST_INCR(x).#en
3560: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  dif../*.** These
3570: 20 61 72 65 20 62 69 74 73 20 74 68 61 74 20 63   are bits that c
3580: 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50 61 67  an be set in Pag
3590: 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23  er.errMask..*/.#
35a0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52  define PAGER_ERR
35b0: 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20  _FULL     0x01  
35c0: 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66 61 69  /* a write() fai
35d0: 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  led */.#define P
35e0: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20  AGER_ERR_MEM    
35f0: 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f    0x02  /* mallo
3600: 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64  c() failed */.#d
3610: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
3620: 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f  LOCK     0x04  /
3630: 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c  * error in the l
3640: 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
3650: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3660: 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78  _ERR_CORRUPT  0x
3670: 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20  08  /* database 
3680: 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  or journal corru
3690: 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65  ption */.#define
36a0: 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20   PAGER_ERR_DISK 
36b0: 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e      0x10  /* gen
36c0: 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72  eral disk I/O er
36d0: 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64 20 64  ror - bad hard d
36e0: 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  rive? */../*.** 
36f0: 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65  Journal files be
3700: 67 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c  gin with the fol
3710: 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72  lowing magic str
3720: 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a  ing.  The data.*
3730: 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66  * was obtained f
3740: 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e  rom /dev/random.
3750: 20 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c    It is used onl
3760: 79 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68  y as a sanity ch
3770: 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65  eck..**.** Since
3780: 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20   version 2.8.0, 
3790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  the journal form
37a0: 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69  at contains addi
37b0: 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a  tional sanity.**
37c0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
37d0: 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70  ation.  If the p
37e0: 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65  ower fails while
37f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
3800: 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e  begin.** written
3810: 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61  , semi-random ga
3820: 72 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74  rbage data might
3830: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a   appear in the j
3840: 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61  ournal.** file a
3850: 66 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65  fter power is re
3860: 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61  stored.  If an a
3870: 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d  ttempt is then m
3880: 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74  ade.** to roll t
3890: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c  he journal back,
38a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
38b0: 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64  uld be corrupted
38c0: 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61  .  The additiona
38d0: 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63  l.** sanity chec
38e0: 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20  king data is an 
38f0: 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f  attempt to disco
3900: 76 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20  ver the garbage 
3910: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
3920: 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e  l and ignore it.
3930: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74  .**.** The sanit
3940: 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72  y checking infor
3950: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e  mation for the n
3960: 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ew journal forma
3970: 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66  t consists.** of
3980: 20 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73   a 32-bit checks
3990: 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  um on each page 
39a0: 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68  of data.  The ch
39b0: 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f  ecksum covers bo
39c0: 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e  th.** the page n
39d0: 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50  umber and the pP
39e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
39f0: 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72  ytes of data for
3a00: 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68   the page..** Th
3a10: 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74  is cksum is init
3a20: 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d  ialized to a 32-
3a30: 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65  bit random value
3a40: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e   that appears in
3a50: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
3a60: 66 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72  file right after
3a70: 20 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68   the header.  Th
3a80: 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  e random initial
3a90: 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e  izer is importan
3aa0: 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61  t,.** because ga
3ab0: 72 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20  rbage data that 
3ac0: 61 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65  appears at the e
3ad0: 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  nd of a journal 
3ae0: 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74  is likely.** dat
3af0: 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20  a that was once 
3b00: 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74  in other files t
3b10: 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65  hat have now bee
3b20: 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74  n deleted.  If t
3b30: 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61  he.** garbage da
3b40: 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20  ta came from an 
3b50: 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c  obsolete journal
3b60: 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b   file, the check
3b70: 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65  sums might.** be
3b80: 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62   correct.  But b
3b90: 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74  y initializing t
3ba0: 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72  he checksum to r
3bb0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63  andom value whic
3bc0: 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e  h.** is differen
3bd0: 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72  t for every jour
3be0: 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65  nal, we minimize
3bf0: 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73   that risk..*/.s
3c00: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
3c10: 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e  gned char aJourn
3c20: 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20  alMagic[] = {.  
3c30: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
3c40: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
3c50: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a  a1, 0x63, 0xd7,.
3c60: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69  };../*.** The si
3c70: 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
3c80: 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67   and of each pag
3c90: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
3ca0: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   is determined.*
3cb0: 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * by the followi
3cc0: 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64  ng macros..*/.#d
3cd0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47  efine JOURNAL_PG
3ce0: 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28 28 70  _SZ(pPager)  ((p
3cf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
3d00: 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   + 8)../*.** The
3d10: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3d20: 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61  size for this pa
3d30: 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75  ger. In the futu
3d40: 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62  re, this could b
3d50: 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65  e.** set to some
3d60: 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
3d70: 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f   the disk contro
3d80: 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74  ller. The import
3d90: 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  ant.** character
3da0: 69 73 74 69 63 20 69 73 20 74 68 61 74 20 69 74  istic is that it
3db0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a   is the same siz
3dc0: 65 20 61 73 20 61 20 64 69 73 6b 20 73 65 63 74  e as a disk sect
3dd0: 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a  or..*/.#define J
3de0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
3df0: 61 67 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73  ager) (pPager->s
3e00: 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a  ectorSize)../*.*
3e10: 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44  * The macro MEMD
3e20: 42 20 69 73 20 74 72 75 65 20 69 66 20 77 65 20  B is true if we 
3e30: 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
3e40: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61   an in-memory da
3e50: 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f  tabase..** We do
3e60: 20 74 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f   this as a macro
3e70: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
3e80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
3e90: 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65  RYDB macro is se
3ea0: 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  t,.** the value 
3eb0: 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65  of MEMDB will be
3ec0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20   a constant and 
3ed0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c  the compiler wil
3ee0: 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75  l optimize.** ou
3ef0: 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c  t code that woul
3f00: 64 20 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e  d never execute.
3f10: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3f20: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
3f30: 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30  # define MEMDB 0
3f40: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
3f50: 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65  MEMDB pPager->me
3f60: 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  mDb.#endif../*.*
3f70: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 69  * The default si
3f80: 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63  ze of a disk sec
3f90: 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50  tor.*/.#define P
3fa0: 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AGER_SECTOR_SIZE
3fb0: 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65   512../*.** Page
3fc0: 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a   number PAGER_MJ
3fd0: 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75  _PGNO is never u
3fe0: 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65  sed in an SQLite
3ff0: 20 64 61 74 61 62 61 73 65 20 28 69 74 20 69 73   database (it is
4000: 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72  .** reserved for
4010: 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20   working around 
4020: 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20  a windows/posix 
4030: 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29  incompatibility)
4040: 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20  . It is.** used 
4050: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  in the journal t
4060: 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74 20 74  o signify that t
4070: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
4080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
4090: 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20   .** is devoted 
40a0: 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73  to storing a mas
40b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
40c0: 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20   - there are no 
40d0: 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a  more pages to.**
40e0: 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20   roll back. See 
40f0: 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e  comments for fun
4100: 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65  ction writeMaste
4110: 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64  rJournal() for d
4120: 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64  etails..*/./* #d
4130: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
4140: 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f  GNO(x) (PENDING_
4150: 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53  BYTE/((x)->pageS
4160: 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65  ize)) */.#define
4170: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78   PAGER_MJ_PGNO(x
4180: 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  ) ((PENDING_BYTE
4190: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
41a0: 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )+1)../*.** The 
41b0: 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61  maximum legal pa
41c0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e  ge number is (2^
41d0: 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66  31 - 1)..*/.#def
41e0: 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47  ine PAGER_MAX_PG
41f0: 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f  NO 2147483647../
4200: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65  *.** Enable refe
4210: 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63  rence count trac
4220: 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67  king (for debugg
4230: 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69  ing) here:.*/.#i
4240: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4250: 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72  G.  int pager3_r
4260: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20  efinfo_enable = 
4270: 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  0;.  static void
4280: 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50   pager_refinfo(P
4290: 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74  gHdr *p){.    st
42a0: 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30  atic int cnt = 0
42b0: 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67 65 72  ;.    if( !pager
42c0: 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65  3_refinfo_enable
42d0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73   ) return;.    s
42e0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
42f0: 66 28 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e  f(.       "REFCN
4300: 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e  T: %4d addr=%p n
4310: 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  Ref=%d\n",.     
4320: 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52    p->pgno, PGHDR
4330: 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e  _TO_DATA(p), p->
4340: 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20  nRef.    );.    
4350: 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65  cnt++;   /* Some
4360: 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62  thing to set a b
4370: 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a  reakpoint on */.
4380: 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46    }.# define REF
4390: 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72  INFO(X)  pager_r
43a0: 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a  efinfo(X).#else.
43b0: 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f  # define REFINFO
43c0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
43d0: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
43e0: 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65  integer from the
43f0: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4400: 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74  riptor.  Store t
4410: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68  he integer.** th
4420: 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70  at is read in *p
4430: 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  Res.  Return SQL
4440: 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
4450: 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20  hing worked, or 
4460: 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  an.** error code
4470: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4480: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20  es wrong..**.** 
4490: 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73  All values are s
44a0: 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73  tored on disk as
44b0: 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a   big-endian..*/.
44c0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33  static int read3
44d0: 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64  2bits(OsFile *fd
44e0: 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20  , u32 *pRes){.  
44f0: 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72  u32 res;.  int r
4500: 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
4510: 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72 65 73  3OsRead(fd, &res
4520: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
4530: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4540: 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67  _OK ){.    unsig
4550: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
4560: 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26      memcpy(ac, &
4570: 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73  res, 4);.    res
4580: 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c   = (ac[0]<<24) |
4590: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
45a0: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
45b0: 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  ];.  }.  *pRes =
45c0: 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72   res;.  return r
45d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  c;.}../*.** Writ
45e0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
45f0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
4600: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
4610: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
4620: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
4630: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
4640: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
4650: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
4660: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
4670: 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66  32bits(OsFile *f
4680: 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75  d, u32 val){.  u
4690: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
46a0: 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  4];.  ac[0] = (v
46b0: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
46c0: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
46d0: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
46e0: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
46f0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
4700: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72   val & 0xff;.  r
4710: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57  eturn sqlite3OsW
4720: 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b  rite(fd, ac, 4);
4730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
4740: 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67  the 32-bit integ
4750: 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68  er 'val' into th
4760: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
4770: 64 20 62 79 20 70 61 67 65 20 68 65 61 64 65 72  d by page header
4780: 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65  .** 'p' at offse
4790: 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73  t 'offset'..*/.s
47a0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65  tatic void store
47b0: 33 32 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20  32bits(u32 val, 
47c0: 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66  PgHdr *p, int of
47d0: 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  fset){.  unsigne
47e0: 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63  d char *ac;.  ac
47f0: 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63   = &((unsigned c
4800: 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
4810: 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a  TA(p))[offset];.
4820: 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e    ac[0] = (val>>
4830: 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  24) & 0xff;.  ac
4840: 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20  [1] = (val>>16) 
4850: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20  & 0xff;.  ac[2] 
4860: 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66  = (val>>8) & 0xf
4870: 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c  f;.  ac[3] = val
4880: 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a   & 0xff;.}../*.*
4890: 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20  * Read a 32-bit 
48a0: 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66 73 65  integer at offse
48b0: 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20  t 'offset' from 
48c0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
48d0: 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68  ied by.** page h
48e0: 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74  eader 'p'..*/.st
48f0: 61 74 69 63 20 75 33 32 20 72 65 74 72 69 65 76  atic u32 retriev
4900: 65 33 32 62 69 74 73 28 50 67 48 64 72 20 2a 70  e32bits(PgHdr *p
4910: 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20  , int offset){. 
4920: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4930: 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e  ac;.  ac = &((un
4940: 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48  signed char*)PGH
4950: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f  DR_TO_DATA(p))[o
4960: 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e  ffset];.  return
4970: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4980: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4990: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
49a0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65  .}.../*.** Conve
49b0: 72 74 20 74 68 65 20 62 69 74 73 20 69 6e 20 74  rt the bits in t
49c0: 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  he pPager->errMa
49d0: 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f  sk into an appro
49e0: 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20  prate.** return 
49f0: 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
4a00: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64  int pager_errcod
4a10: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
4a20: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
4a30: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
4a40: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4a50: 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29  PAGER_ERR_LOCK )
4a60: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4a70: 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20  PROTOCOL;.  if( 
4a80: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4a90: 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  & PAGER_ERR_DISK
4aa0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
4ab0: 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70  E_IOERR;.  if( p
4ac0: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4ad0: 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20   PAGER_ERR_FULL 
4ae0: 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  )    rc = SQLITE
4af0: 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61  _FULL;.  if( pPa
4b00: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
4b10: 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20  AGER_ERR_MEM )  
4b20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
4b30: 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67  OMEM;.  if( pPag
4b40: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4b50: 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20  GER_ERR_CORRUPT 
4b60: 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ) rc = SQLITE_CO
4b70: 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20  RRUPT;.  return 
4b80: 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
4b90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
4ba0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
4bb0: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
4bc0: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
4bd0: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
4be0: 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67 65  c u32 pager_page
4bf0: 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61 67  hash(PgHdr *pPag
4c00: 65 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d  e){.  u32 hash =
4c10: 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75   0;.  int i;.  u
4c20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
4c30: 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  ata = (unsigned 
4c40: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
4c50: 44 41 54 41 28 70 50 61 67 65 29 3b 0a 20 20 66  DATA(pPage);.  f
4c60: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
4c70: 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  >pPager->pageSiz
4c80: 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73  e; i++){.    has
4c90: 68 20 3d 20 28 68 61 73 68 2b 69 29 5e 70 44 61  h = (hash+i)^pDa
4ca0: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
4cb0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f 2a 0a  urn hash;.}../*.
4cc0: 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47  ** The CHECK_PAG
4cd0: 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20  E macro takes a 
4ce0: 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67  PgHdr* as an arg
4cf0: 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45  ument. If SQLITE
4d00: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20  _CHECK_PAGES.** 
4d10: 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20  is defined, and 
4d20: 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65  NDEBUG is not de
4d30: 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74  fined, an assert
4d40: 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65  () statement che
4d50: 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  cks.** that the 
4d60: 70 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64  page is either d
4d70: 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61  irty or still ma
4d80: 74 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c  tches the calcul
4d90: 61 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a  ated page-hash..
4da0: 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b  */.#define CHECK
4db0: 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61  _PAGE(x) checkPa
4dc0: 67 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69  ge(x).static voi
4dd0: 64 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64  d checkPage(PgHd
4de0: 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
4df0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
4e00: 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74  pPager;.  assert
4e10: 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68  ( !pPg->pageHash
4e20: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 4d   || pPager->errM
4e30: 61 73 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20  ask || MEMDB || 
4e40: 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20  pPg->dirty || . 
4e50: 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61       pPg->pageHa
4e60: 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61  sh==pager_pageha
4e70: 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65  sh(pPg) );.}..#e
4e80: 6c 73 65 0a 23 64 65 66 69 6e 65 20 43 48 45 43  lse.#define CHEC
4e90: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
4ea0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
4eb0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
4ec0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
4ed0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
4ee0: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
4ef0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
4f00: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
4f10: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
4f20: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
4f30: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
4f40: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
4f50: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
4f60: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
4f70: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
4f80: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
4f90: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
4fa0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
4fb0: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
4fc0: 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73  iteFree() *pzMas
4fd0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ter..**.** If no
4fe0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
4ff0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
5000: 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69  sent *pzMaster i
5010: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
5020: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
5030: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
5040: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
5050: 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a  urnal(OsFile *pJ
5060: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
5070: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
5080: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
5090: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
50a0: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
50b0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
50c0: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
50d0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
50e0: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
50f0: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
5100: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
5110: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
5120: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
5130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
5140: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
5150: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
5160: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
5170: 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28  , szJ-16);.  if(
5180: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
5190: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20   return rc;. .  
51a0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
51b0: 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20  pJrnl, &len);.  
51c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
51d0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
51e0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
51f0: 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29  s(pJrnl, &cksum)
5200: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
5210: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
5220: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5230: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
5240: 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66  aMagic, 8);.  if
5250: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
5260: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
5270: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
5280: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
5290: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
52a0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
52b0: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
52c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
52d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a   return rc;..  *
52e0: 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72  pzMaster = (char
52f0: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
5300: 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a  len+1);.  if( !*
5310: 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  pzMaster ){.    
5320: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
5330: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
5340: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5350: 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20  rnl, *pzMaster, 
5360: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
5370: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5380: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
5390: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
53a0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
53b0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
53c0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
53d0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
53e0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
53f0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
5400: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
5410: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
5420: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a  (*pzMaster)[i];.
5430: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
5440: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
5450: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
5460: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
5470: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
5480: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
5490: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
54a0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
54b0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
54c0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
54d0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
54e0: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
54f0: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
5500: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
5510: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
5520: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
5530: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
5540: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
5550: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
5560: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
5570: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
5580: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e   (*pzMaster)[len
5590: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
55a0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
55b0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
55c0: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  eek the journal 
55d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
55e0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
55f0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72  or boundary wher
5600: 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  e a.** journal h
5610: 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61  eader may be rea
5620: 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61  d or written. Pa
5630: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  ger.journalOff i
5640: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a  s updated with.*
5650: 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f  * the new seek o
5660: 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ffset..**.** i.e
5670: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
5680: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
5690: 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20   Input Offset   
56a0: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
56b0: 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d  t Offset.** ----
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20  ---.** 0        
56f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5700: 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20   0.** 512       
5710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5720: 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20  512.** 100      
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5740: 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20   512.** 2000    
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
5770: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75  atic int seekJou
5780: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
5790: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
57a0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
57b0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
57c0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
57d0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
57e0: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
57f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
5800: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
5810: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
5820: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
5830: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
5840: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
5850: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
5860: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
5870: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
5880: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5890: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
58a0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
58b0: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  et;.  return sql
58c0: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
58d0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
58e0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a  >journalOff);.}.
58f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5900: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
5910: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72  open when this r
5920: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
5930: 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68  . A journal.** h
5940: 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48  eader (JOURNAL_H
5950: 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20  DR_SZ bytes) is 
5960: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
5970: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74   journal file at
5980: 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20   the.** current 
5990: 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
59a0: 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74  The format for t
59b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
59c0: 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  r is as follows:
59d0: 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d  .** - 8 bytes: M
59e0: 61 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67  agic identifying
59f0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e   journal format.
5a00: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e  .** - 4 bytes: N
5a10: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
5a20: 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20   in journal, or 
5a30: 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20  -1 no-sync mode 
5a40: 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79  is on..** - 4 by
5a50: 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62  tes: Random numb
5a60: 65 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65  er used for page
5a70: 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79   hash..** - 4 by
5a80: 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74  tes: Initial dat
5a90: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
5aa0: 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20  ..** - 4 bytes: 
5ab0: 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64  Sector size used
5ac0: 20 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20   by the process 
5ad0: 74 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20  that wrote this 
5ae0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20  journal..** .** 
5af0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
5b00: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34  RNAL_HDR_SZ - 24
5b10: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
5b20: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
5b30: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
5b40: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
5b50: 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63  ager){..  int rc
5b60: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5b70: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5b80: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5b90: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
5ba0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
5bb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5bc0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  f( pPager->stmtH
5bd0: 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  drOff==0 ){.    
5be0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
5bf0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
5c00: 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70  rnalHdr;.  }.  p
5c10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
5c20: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
5c30: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
5c40: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
5c50: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
5c60: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
5c70: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
5c80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
5c90: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
5ca0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
5cb0: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
5cc0: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
5cd0: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
5ce0: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
5cf0: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
5d00: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
5d10: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
5d20: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
5d30: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
5d40: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
5d50: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
5d60: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
5d70: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
5d80: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
5d90: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
5da0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
5db0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5dc0: 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e   The nRec Field.
5dd0: 20 30 78 46 46 46 46 46 46 46 46 20 66 6f 72 20   0xFFFFFFFF for 
5de0: 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73  no-sync journals
5df0: 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  . */.    rc = wr
5e00: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5e10: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5e20: 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66  noSync ? 0xfffff
5e30: 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20  fff : 0);.  }.  
5e40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5e50: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  K ){.    /* The 
5e60: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
5e70: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
5e80: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e   .    sqlite3Ran
5e90: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
5ea0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
5eb0: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
5ec0: 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d  mInit);.    rc =
5ed0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
5ee0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5ef0: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20  r->cksumInit);. 
5f00: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5f10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5f20: 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74   The initial dat
5f30: 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20  abase size */.  
5f40: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
5f50: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
5f60: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29   pPager->dbSize)
5f70: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
5f80: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5f90: 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20   /* The assumed 
5fa0: 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20  sector size for 
5fb0: 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a  this process */.
5fc0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5fd0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5fe0: 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  d, pPager->secto
5ff0: 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f  rSize);.  }..  /
6000: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
6010: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 77 72  ader has been wr
6020: 69 74 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c  itten successful
6030: 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  ly. Seek the jou
6040: 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64  rnal.  ** file d
6050: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
6060: 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72   end of the jour
6070: 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f  nal header secto
6080: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  r..  */.  if( rc
6090: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
60a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
60b0: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
60c0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
60d0: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69  nalOff-1);.    i
60e0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
60f0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6100: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
6110: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30  Pager->jfd, "\00
6120: 30 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  0", 1);.    }.  
6130: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
6140: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ../*.** The jour
6150: 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65  nal file must be
6160: 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20   open when this 
6170: 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75  is called. A jou
6180: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
6190: 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  .** (JOURNAL_HDR
61a0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65  _SZ bytes) is re
61b0: 61 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  ad from the curr
61c0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
61d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
61e0: 69 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  ile. See comment
61f0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
6200: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
6210: 28 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70  () for a descrip
6220: 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a  tion of.** the j
6230: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
6240: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
6250: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
6260: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
6270: 2a 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  *nRec is set to 
6280: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
6290: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
62a0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
62b0: 64 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20  der and *dbSize 
62c0: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69  is set to the si
62d0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ze of the.** dat
62e0: 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65  abase before the
62f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67   transaction beg
6300: 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c  an, in pages. Al
6310: 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  so, pPager->cksu
6320: 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20  mInit.** is set 
6330: 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  to the value rea
6340: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
6350: 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54  al header. SQLIT
6360: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
6370: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
6380: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
6390: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
63a0: 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65  le appears to be
63b0: 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49   corrupted, SQLI
63c0: 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65  TE_DONE is.** re
63d0: 74 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63  turned and *nRec
63e0: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65   and *dbSize are
63f0: 20 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f   not set.  If JO
6400: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
6410: 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20  es.** cannot be 
6420: 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f  read from the jo
6430: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72  urnal file an er
6440: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
6450: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6460: 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  int readJournalH
6470: 64 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  dr(.  Pager *pPa
6480: 67 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72  ger, .  i64 jour
6490: 6e 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a  nalSize,.  u32 *
64a0: 70 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70  pNRec, .  u32 *p
64b0: 44 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20  DbSize.){.  int 
64c0: 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
64d0: 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f  har aMagic[8]; /
64e0: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
64f0: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6500: 64 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73  der */..  rc = s
6510: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eekJournalHdr(pP
6520: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20  ager);.  if( rc 
6530: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6540: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
6550: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
6560: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
6570: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
6580: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6590: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63  _DONE;.  }..  rc
65a0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
65b0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61  (&pPager->jfd, a
65c0: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
65d0: 61 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63  agic));.  if( rc
65e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
65f0: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
6600: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
6610: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6620: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
6630: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
6640: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
6650: 64 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  d32bits(&pPager-
6660: 3e 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20  >jfd, pNRec);.  
6670: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6680: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
6690: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
66a0: 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  jfd, &pPager->ck
66b0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20  sumInit);.  if( 
66c0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
66d0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
66e0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
66f0: 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28   pDbSize);.  if(
6700: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6710: 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
6720: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
6730: 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74  -size to match t
6740: 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79  he value used by
6750: 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65   .  ** the proce
6760: 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20  ss that created 
6770: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  this journal. If
6780: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
6790: 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62  s.  ** created b
67a0: 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65  y a process othe
67b0: 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c  r than this one,
67c0: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
67d0: 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  ne.  ** is being
67e0: 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74   called from wit
67f0: 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61  hin pager_playba
6800: 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20  ck(). The local 
6810: 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61  value.  ** of Pa
6820: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
6830: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
6840: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
6850: 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63  utine..  */.  rc
6860: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70   = read32bits(&p
6870: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32  Pager->jfd, (u32
6880: 20 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74   *)&pPager->sect
6890: 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72  orSize);.  if( r
68a0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
68b0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
68c0: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
68d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
68e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
68f0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
6900: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
6910: 61 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e  alOff);.  return
6920: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
6930: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
6940: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
6950: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
6960: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
6970: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
6980: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
6990: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
69a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
69b0: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
69c0: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
69d0: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
69e0: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
69f0: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
6a00: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
6a10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
6a20: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
6a30: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
6a40: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
6a50: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
6a60: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
6a70: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
6a80: 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50  .** + 4 bytes: P
6a90: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a  AGER_MJ_PGNO..**
6aa0: 20 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67   + N bytes: leng
6ab0: 74 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  th of master jou
6ac0: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20  rnal name..** + 
6ad0: 34 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20  4 bytes: N.** + 
6ae0: 34 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20  4 bytes: Master 
6af0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65  journal name che
6b00: 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79  cksum..** + 8 by
6b10: 74 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  tes: aJournalMag
6b20: 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ic[]..**.** The 
6b30: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
6b40: 61 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  age checksum is 
6b50: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62  the sum of the b
6b60: 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74  ytes in the mast
6b70: 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61  er.** journal na
6b80: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
6b90: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
6ba0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
6bb0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
6bc0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
6bd0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
6be0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20    int i; .  u32 
6bf0: 63 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69  cksum = 0; ..  i
6c00: 66 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70  f( !zMaster || p
6c10: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
6c20: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
6c30: 4f 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65  OK;.  pPager->se
6c40: 74 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20  tMaster = 1;..  
6c50: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61  len = strlen(zMa
6c60: 73 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ster);.  for(i=0
6c70: 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20  ; i<len; i++){. 
6c80: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73     cksum += zMas
6c90: 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  ter[i];.  }..  /
6ca0: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
6cb0: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
6cc0: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
6cd0: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
6ce0: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
6cf0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
6d00: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
6d10: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
6d20: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
6d30: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
6d40: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
6d50: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
6d60: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
6d70: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72  ullSync ){.    r
6d80: 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48  c = seekJournalH
6d90: 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
6da0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6db0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
6dc0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
6dd0: 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b  rnalOff += (len+
6de0: 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69  20);..  rc = wri
6df0: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
6e00: 2d 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f  ->jfd, PAGER_MJ_
6e10: 50 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20  PGNO(pPager));. 
6e20: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
6e30: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
6e40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
6e50: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
6e60: 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65  jfd, zMaster, le
6e70: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
6e80: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6e90: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69   rc;..  rc = wri
6ea0: 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
6eb0: 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69  ->jfd, len);.  i
6ec0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6ed0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
6ee0: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
6ef0: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
6f00: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
6f10: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
6f20: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
6f30: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
6f40: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
6f50: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
6f60: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
6f70: 63 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  c));.  pPager->n
6f80: 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
6f90: 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74  r->noSync;.  ret
6fa0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6fb0: 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61   Add or remove a
6fc0: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c   page from the l
6fd0: 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73  ist of all pages
6fe0: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
6ff0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  .** statement jo
7000: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
7010: 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73   Pager keeps a s
7020: 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20  eparate list of 
7030: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63  pages that are c
7040: 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74  urrently in.** t
7050: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
7060: 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70  rnal.  This help
7070: 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67  s the sqlite3pag
7080: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29  er_stmt_commit()
7090: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20  .** routine run 
70a0: 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20  MUCH faster for 
70b0: 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
70c0: 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20  where there are 
70d0: 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e  many.** pages in
70e0: 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79   memory but only
70f0: 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68   a few are in th
7100: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
7110: 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  nal..*/.static v
7120: 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f  oid page_add_to_
7130: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
7140: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
7150: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
7160: 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d  ager;.  if( pPg-
7170: 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e  >inStmt ) return
7180: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
7190: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26  >pPrevStmt==0 &&
71a0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d   pPg->pNextStmt=
71b0: 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72  =0 );.  pPg->pPr
71c0: 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  evStmt = 0;.  if
71d0: 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20  ( pPager->pStmt 
71e0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
71f0: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
7200: 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67  = pPg;.  }.  pPg
7210: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
7220: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70  ager->pStmt;.  p
7230: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
7240: 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d  Pg;.  pPg->inStm
7250: 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20  t = 1;.}.static 
7260: 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65  void page_remove
7270: 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28  _from_stmt_list(
7280: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
7290: 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  f( !pPg->inStmt 
72a0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
72b0: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29  pPg->pPrevStmt )
72c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
72d0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
72e0: 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  extStmt==pPg );.
72f0: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74      pPg->pPrevSt
7300: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  mt->pNextStmt = 
7310: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a  pPg->pNextStmt;.
7320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7330: 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
7340: 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a  ->pStmt==pPg );.
7350: 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
7360: 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e  >pStmt = pPg->pN
7370: 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69  extStmt;.  }.  i
7380: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  f( pPg->pNextStm
7390: 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  t ){.    assert(
73a0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
73b0: 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20  >pPrevStmt==pPg 
73c0: 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  );.    pPg->pNex
73d0: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
73e0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d   = pPg->pPrevStm
73f0: 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  t;.  }.  pPg->pN
7400: 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  extStmt = 0;.  p
7410: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  Pg->pPrevStmt = 
7420: 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  0;.  pPg->inStmt
7430: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46   = 0;.}../*.** F
7440: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
7450: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
7460: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
7470: 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61  er.  Return.** a
7480: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
7490: 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20  page or NULL if 
74a0: 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74  not found..*/.st
74b0: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
74c0: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
74d0: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
74e0: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  o){.  PgHdr *p =
74f0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
7500: 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d  ager_hash(pgno)]
7510: 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20  ;.  while( p && 
7520: 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b  p->pgno!=pgno ){
7530: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
7540: 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74  tHash;.  }.  ret
7550: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
7560: 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  Unlock the datab
7570: 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68  ase and clear th
7580: 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
7590: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
75a0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61  .** sets the sta
75b0: 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
75c0: 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20  back to what it 
75d0: 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20  was when it was 
75e0: 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e  first.** opened.
75f0: 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e    Any outstandin
7600: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
7610: 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73  lidated and subs
7620: 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a  equent attempts.
7630: 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f  ** to access tho
7640: 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69  se pages will li
7650: 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61  kely result in a
7660: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74   coredump..*/.st
7670: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7680: 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61  reset(Pager *pPa
7690: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
76a0: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66  Pg, *pNext;.  if
76b0: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
76c0: 6b 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  k ) return;.  fo
76d0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
76e0: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  ll; pPg; pPg=pNe
76f0: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
7700: 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
7710: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
7720: 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  Pg);.  }.  pPage
7730: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
7740: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
7750: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
7760: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
7770: 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
7780: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   0;.  memset(pPa
7790: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
77a0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
77b0: 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ash));.  pPager-
77c0: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66  >nPage = 0;.  if
77d0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
77e0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
77f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  ){.    sqlite3pa
7800: 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
7810: 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
7820: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
7830: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
7840: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61  );.  pPager->sta
7850: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
7860: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  K;.  pPager->dbS
7870: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67  ize = -1;.  pPag
7880: 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20  er->nRef = 0;.  
7890: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
78a0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
78b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
78c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
78d0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 70 61   to reset the pa
78e0: 67 65 72 20 61 66 74 65 72 20 61 20 6d 61 6c 6c  ger after a mall
78f0: 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 20 54 68  oc() failure. Th
7900: 69 73 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 77 6f  is.** doesn't wo
7910: 72 6b 20 77 69 74 68 20 69 6e 2d 6d 65 6d 6f 72  rk with in-memor
7920: 79 20 64 61 74 61 62 61 73 65 73 2e 20 49 66 20  y databases. If 
7930: 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73  a malloc() fails
7940: 20 77 68 65 6e 20 61 6e 20 0a 2a 2a 20 69 6e 2d   when an .** in-
7950: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
7960: 69 73 20 69 6e 20 75 73 65 20 69 74 20 69 73 20  is in use it is 
7970: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  not possible to 
7980: 72 65 63 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  recover..**.** I
7990: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
79a0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  or statement tra
79b0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
79c0: 76 65 2c 20 69 74 20 69 73 20 72 6f 6c 6c 65 64  ve, it is rolled
79d0: 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 74 20   back..**.** It 
79e0: 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63  is an error to c
79f0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
7a00: 6e 20 69 66 20 61 6e 79 20 70 61 67 65 73 20 61  n if any pages a
7a10: 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69  re in use..*/.#i
7a20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7a30: 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a  T_GLOBALRECOVER.
7a40: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
7a50: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
7a60: 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61  ager){.  if( pPa
7a70: 67 65 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ger ){.    if( p
7a80: 50 61 67 65 72 2d 3e 6e 52 65 66 20 7c 7c 20 4d  Pager->nRef || M
7a90: 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65  EMDB ){.      re
7aa0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
7ab0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  R;.    }.    pPa
7ac0: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 3d 20  ger->errMask &= 
7ad0: 7e 28 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 29  ~(PAGER_ERR_MEM)
7ae0: 3b 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65  ;.    pager_rese
7af0: 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  t(pPager);.  }. 
7b00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b10: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  K;.}.#endif.../*
7b20: 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f  .** When this ro
7b30: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
7b40: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 74   the pager has t
7b50: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
7b60: 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45  open and.** a RE
7b70: 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53  SERVED or EXCLUS
7b80: 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
7b90: 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
7ba0: 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73  routine releases
7bb0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
7bc0: 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72   lock and acquir
7bd0: 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  es a SHARED lock
7be0: 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20   in its place.  
7bf0: 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  The journal.** f
7c00: 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 61  ile is deleted a
7c10: 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  nd closed..**.**
7c20: 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20   TODO: Consider 
7c30: 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72  keeping the jour
7c40: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f  nal file open fo
7c50: 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61  r temporary data
7c60: 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d  bases..** This m
7c70: 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72 66  ight give a perf
7c80: 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d  ormance improvem
7c90: 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77  ent on windows w
7ca0: 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  here opening.** 
7cb0: 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70  a file is an exp
7cc0: 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e  ensive operation
7cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
7ce0: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
7cf0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
7d00: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
7d10: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
7d20: 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
7d30: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
7d40: 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  e<PAGER_RESERVED
7d50: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7d60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
7d70: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
7d80: 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29  t_commit(pPager)
7d90: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
7da0: 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
7db0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
7dc0: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20  pPager->stfd);. 
7dd0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
7de0: 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69  pen = 0;.  }.  i
7df0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
7e00: 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
7e10: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
7e20: 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
7e30: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
7e40: 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  pen = 0;.    sql
7e50: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
7e60: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a  ger->zJournal);.
7e70: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 20      sqliteFree( 
7e80: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
7e90: 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  al );.    pPager
7ea0: 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  ->aInJournal = 0
7eb0: 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50  ;.    for(pPg=pP
7ec0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
7ed0: 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41   pPg=pPg->pNextA
7ee0: 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  ll){.      pPg->
7ef0: 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
7f00: 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
7f10: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7f20: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69  needSync = 0;.#i
7f30: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
7f40: 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
7f50: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
7f60: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
7f70: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
7f80: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
7f90: 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
7fa0: 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
7fb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
7fc0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
7fd0: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
7fe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
7ff0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
8000: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
8010: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
8020: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
8030: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
8040: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
8050: 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  K);.  pPager->st
8060: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
8070: 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72  ED;.  pPager->or
8080: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
8090: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
80a0: 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  r = 0;.  return 
80b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
80c0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
80d0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
80e0: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
80f0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
8100: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
8110: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
8120: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
8130: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
8140: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
8150: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
8160: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
8170: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
8180: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
8190: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
81a0: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
81b0: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
81c0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
81d0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
81e0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
81f0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
8200: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
8210: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
8220: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
8230: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
8240: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
8250: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
8260: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
8270: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
8280: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
8290: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
82a0: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
82b0: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
82c0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
82d0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
82e0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
82f0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
8300: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
8310: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
8320: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
8330: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
8340: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
8350: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
8360: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
8370: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
8380: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
8390: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
83a0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
83b0: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
83c0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
83d0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
83e0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
83f0: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
8400: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
8410: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
8420: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
8430: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
8440: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
8450: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
8460: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
8470: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
8480: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
8490: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
84a0: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
84b0: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
84c0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
84d0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
84e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
84f0: 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20  gno pgno, const 
8500: 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20  char *aData){.  
8510: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
8520: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
8530: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
8540: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
8550: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
8560: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
8570: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
8580: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
8590: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
85a0: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
85b0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
85c0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
85d0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
85e0: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
85f0: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
8600: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
8610: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
8620: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
8630: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
8640: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
8650: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
8660: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
8670: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
8680: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
8690: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
86a0: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
86b0: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
86c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
86d0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
86e0: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
86f0: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
8700: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
8710: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
8720: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
8730: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
8740: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
8750: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
8760: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8780: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
8790: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
87a0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
87b0: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
87c0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
87d0: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
87e0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
87f0: 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54    u8 aData[SQLIT
8800: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d  E_MAX_PAGE_SIZE]
8810: 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61  ;  /* Temp stora
8820: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
8830: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
8840: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
8850: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
8860: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
8870: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
8880: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
8890: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
88a0: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
88b0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
88c0: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
88d0: 3f 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a  ? &pPager->jfd :
88e0: 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20   &pPager->stfd) 
88f0: 29 3b 0a 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  );...  rc = read
8900: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e  32bits(jfd, &pgn
8910: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
8920: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8930: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
8940: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26  te3OsRead(jfd, &
8950: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
8960: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
8970: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8980: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
8990: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
89a0: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
89b0: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
89c0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
89d0: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
89e0: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
89f0: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
8a00: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
8a10: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
8a20: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
8a30: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
8a40: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
8a50: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
8a60: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
8a70: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
8a80: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
8a90: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
8aa0: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
8ab0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
8ac0: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
8ad0: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
8ae0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
8af0: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
8b00: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
8b10: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
8b20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
8b30: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
8b40: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
8b50: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
8b60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8b70: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
8b80: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
8b90: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
8ba0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
8bb0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8bc0: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
8bd0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
8be0: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
8bf0: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  sum(pPager, pgno
8c00: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
8c10: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
8c20: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
8c30: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
8c40: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
8c50: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
8c60: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
8c70: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
8c80: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
8c90: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
8ca0: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
8cb0: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
8cc0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
8cd0: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
8ce0: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
8cf0: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
8d00: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
8d10: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
8d20: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
8d30: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
8d40: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
8d50: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
8d60: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
8d70: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
8d80: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
8d90: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
8da0: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
8db0: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
8dc0: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
8dd0: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
8de0: 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20 2a   dirty..  **.  *
8df0: 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a 20  * Ticket #1171: 
8e00: 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   The statement j
8e10: 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f 6e  ournal might con
8e20: 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65 6e  tain page conten
8e30: 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 64  t that is.  ** d
8e40: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
8e50: 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 61  e page content a
8e60: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
8e70: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
8e80: 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72 73    ** This occurs
8e90: 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73 20   when a page is 
8ea0: 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74 6f  changed prior to
8eb0: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61 20   the start of a 
8ec0: 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74  statement.  ** t
8ed0: 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61 69  hen changed agai
8ee0: 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  n within the sta
8ef0: 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72 6f  tement.  When ro
8f00: 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68 20  lling back such 
8f10: 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  a.  ** statement
8f20: 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72 69   we must not wri
8f30: 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  te to the origin
8f40: 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c 65  al database unle
8f50: 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a 20  ss we know.  ** 
8f60: 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61 74  for certain that
8f70: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
8f80: 6f 6e 74 65 6e 74 73 20 61 72 65 20 69 6e 20 74  ontents are in t
8f90: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
8fa0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
8fb0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 20  Otherwise, if a 
8fc0: 66 75 6c 6c 20 52 4f 4c 4c 42 41 43 4b 20 6f 63  full ROLLBACK oc
8fd0: 63 75 72 73 20 61 66 74 65 72 20 74 68 65 20 73  curs after the s
8fe0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 72 6f  tatement.  ** ro
8ff0: 6c 6c 62 61 63 6b 20 74 68 65 20 66 75 6c 6c 20  llback the full 
9000: 52 4f 4c 4c 42 41 43 4b 20 77 69 6c 6c 20 6e 6f  ROLLBACK will no
9010: 74 20 72 65 73 74 6f 72 65 20 74 68 65 20 70 61  t restore the pa
9020: 67 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ge to its origin
9030: 61 6c 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 2e  al.  ** content.
9040: 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
9050: 20 6d 75 73 74 20 62 65 20 6d 65 74 20 62 65 66   must be met bef
9060: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
9070: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
9080: 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
9090: 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
90a0: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
90b0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
90c0: 72 69 67 69 6e 61 6c 0a 20 20 2a 2a 20 70 61 67  riginal.  ** pag
90d0: 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 69 6e 20  e content is in 
90e0: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
90f0: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
9100: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
9110: 69 6e 0a 20 20 2a 2a 20 63 61 63 68 65 20 6f 72  in.  ** cache or
9120: 20 65 6c 73 65 20 69 74 20 69 73 20 6d 61 72 6b   else it is mark
9130: 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d  ed as needSync==
9140: 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20  0..  */.  pPg = 
9150: 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
9160: 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73  ger, pgno);.  as
9170: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
9180: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
9190: 53 49 56 45 20 7c 7c 20 70 50 67 21 3d 30 20 29  SIVE || pPg!=0 )
91a0: 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59  ;.  TRACE3("PLAY
91b0: 42 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c  BACK %d page %d\
91c0: 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
91d0: 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  er), pgno);.  if
91e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
91f0: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
9200: 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20 70   && (pPg==0 || p
9210: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 29  Pg->needSync==0)
9220: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
9230: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
9240: 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29  er->fd, (pgno-1)
9250: 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
9260: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
9270: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
9280: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9290: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
92a0: 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20  ger->fd, aData, 
92b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
92c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
92d0: 20 70 50 67 20 29 20 70 50 67 2d 3e 64 69 72 74   pPg ) pPg->dirt
92e0: 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  y = 0;.  }.  if(
92f0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
9300: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
9310: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
9320: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
9330: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
9340: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
9350: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
9360: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
9370: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
9380: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
9390: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
93a0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
93b0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
93c0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
93d0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
93e0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
93f0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
9400: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
9410: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
9420: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
9430: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
9440: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
9450: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
9460: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
9470: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
9480: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
9490: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
94a0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
94b0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
94c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
94d0: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
94e0: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
94f0: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
9500: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
9510: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
9520: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
9530: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
9540: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
9550: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
9560: 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
9570: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
9580: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
9590: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 43 4f  );.#endif.    CO
95a0: 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
95b0: 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29  a, pPg->pgno, 3)
95c0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
95d0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  c;.}../*.** Para
95e0: 6d 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73  meter zMaster is
95f0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d   the name of a m
9600: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9610: 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75  le. A single jou
9620: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61  rnal.** file tha
9630: 74 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68  t referred to th
9640: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9650: 20 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62   file has just b
9660: 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e  een rolled back.
9670: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9680: 20 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73   checks if it is
9690: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
96a0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
96b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20  ournal file,.** 
96c0: 61 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69  and does so if i
96d0: 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  t is..**.** The 
96e0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
96f0: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ile contains the
9700: 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68   names of all ch
9710: 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ild journals..**
9720: 20 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61   To tell if a ma
9730: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
9740: 20 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65   be deleted, che
9750: 63 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68  ck to each of th
9760: 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20  e.** children.  
9770: 49 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  If all children 
9780: 61 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69  are either missi
9790: 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66  ng or do not ref
97a0: 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65  er to.** a diffe
97b0: 72 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72  rent master jour
97c0: 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d  nal, then this m
97d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61  aster journal ca
97e0: 6e 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f  n be deleted..*/
97f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
9800: 72 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73  r_delmaster(cons
9810: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
9820: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
9830: 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20  t master_open = 
9840: 30 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74  0;.  OsFile mast
9850: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73  er;.  char *zMas
9860: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20  terJournal = 0; 
9870: 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d  /* Contents of m
9880: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9890: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73  le */.  i64 nMas
98a0: 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20  terJournal;     
98b0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73    /* Size of mas
98c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
98d0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74   */..  /* Open t
98e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
98f0: 6c 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65  l file exclusive
9900: 6c 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20  ly in case some 
9910: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
9920: 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68  ** is running th
9930: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e  is routine also.
9940: 20 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b   Not that it mak
9950: 65 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66  es too much diff
9960: 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d  erence..  */.  m
9970: 65 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30  emset(&master, 0
9980: 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29  , sizeof(master)
9990: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
99a0: 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28  3OsOpenReadOnly(
99b0: 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72  zMaster, &master
99c0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
99d0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
99e0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d  lmaster_out;.  m
99f0: 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a  aster_open = 1;.
9a00: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9a10: 46 69 6c 65 53 69 7a 65 28 26 6d 61 73 74 65 72  FileSize(&master
9a20: 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  , &nMasterJourna
9a30: 6c 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  l);.  if( rc!=SQ
9a40: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64  LITE_OK ) goto d
9a50: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20  elmaster_out;.. 
9a60: 20 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72   if( nMasterJour
9a70: 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61  nal>0 ){.    cha
9a80: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  r *zJournal;.   
9a90: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74   char *zMasterPt
9aa0: 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c  r = 0;..    /* L
9ab0: 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d  oad the entire m
9ac0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
9ad0: 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62  le into space ob
9ae0: 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20  tained from.    
9af0: 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  ** sqliteMalloc(
9b00: 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
9b10: 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
9b20: 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
9b30: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
9b40: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d   (char *)sqliteM
9b50: 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75  alloc(nMasterJou
9b60: 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21  rnal);.    if( !
9b70: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
9b80: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
9b90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9ba0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
9bb0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  out;.    }.    r
9bc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
9bd0: 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74  d(&master, zMast
9be0: 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74  erJournal, nMast
9bf0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
9c00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
9c10: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
9c20: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
9c30: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
9c40: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
9c50: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
9c60: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
9c70: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9c80: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
9c90: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f  OsFileExists(zJo
9ca0: 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20  urnal) ){.      
9cb0: 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20    /* One of the 
9cc0: 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64  journals pointed
9cd0: 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65   to by the maste
9ce0: 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  r journal exists
9cf0: 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65  ..        ** Ope
9d00: 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69  n it and check i
9d10: 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74  f it points at t
9d20: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9d30: 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a  l. If.        **
9d40: 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68   so, return with
9d50: 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65  out deleting the
9d60: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9d70: 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  file..        */
9d80: 0a 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20  .        OsFile 
9d90: 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20  journal;.       
9da0: 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20   int c;..       
9db0: 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c   memset(&journal
9dc0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72  , 0, sizeof(jour
9dd0: 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 72  nal));.        r
9de0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
9df0: 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e  nReadOnly(zJourn
9e00: 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20  al, &journal);. 
9e10: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
9e20: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9e30: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
9e40: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
9e50: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
9e60: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
9e70: 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a  nal(&journal, &z
9e80: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
9e90: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
9ea0: 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  se(&journal);.  
9eb0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9ec0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9ed0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9ee0: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9ef0: 20 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20   }..        c = 
9f00: 7a 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26  zMasterPtr!=0 &&
9f10: 20 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50   strcmp(zMasterP
9f20: 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b  tr, zMaster)==0;
9f30: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
9f40: 72 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b  ree(zMasterPtr);
9f50: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29  .        if( c )
9f60: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
9f70: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20  e have a match. 
9f80: 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  Do not delete th
9f90: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9fa0: 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
9fb0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
9fc0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
9fd0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
9fe0: 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72  zJournal += (str
9ff0: 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29  len(zJournal)+1)
a000: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
a010: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
a020: 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d  (zMaster);..delm
a030: 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28  aster_out:.  if(
a040: 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20   zMasterJournal 
a050: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
a060: 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  e(zMasterJournal
a070: 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d  );.  }  .  if( m
a080: 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20  aster_open ){.  
a090: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a0a0: 28 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20  (&master);.  }. 
a0b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a0c0: 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20  *.** Make every 
a0d0: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
a0e0: 65 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61  e agree with wha
a0f0: 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49  t is on disk.  I
a100: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a  n other words,.*
a110: 2a 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73  * reread the dis
a120: 6b 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  k to reset the s
a130: 74 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68  tate of the cach
a140: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
a150: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
a160: 61 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b  after a rollback
a170: 20 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f   in which some o
a180: 66 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68  f the dirty cach
a190: 65 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e  e.** pages had n
a1a0: 65 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65  ever been writte
a1b0: 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20  n out to disk.  
a1c0: 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20  We need to roll 
a1d0: 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68  back the.** cach
a1e0: 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  e content and th
a1f0: 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
a200: 20 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72   do that is to r
a210: 65 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f  eread the old co
a220: 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72  ntent.** back fr
a230: 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a  om the disk..*/.
a240: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a250: 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61  _reload_cache(Pa
a260: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
a270: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
a280: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
a290: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
a2a0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
a2b0: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
a2c0: 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  ){.    char zBuf
a2d0: 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  [SQLITE_MAX_PAGE
a2e0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20  _SIZE];.    if( 
a2f0: 21 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f  !pPg->dirty ) co
a300: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
a310: 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
a320: 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
a330: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 63  Size ){.      rc
a340: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
a350: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  (&pPager->fd, pP
a360: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
a370: 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
a380: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
a390: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
a3a0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
a3b0: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
a3c0: 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
a3d0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
a3e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52        }.      TR
a3f0: 41 43 45 33 28 22 52 45 46 45 54 43 48 20 25 64  ACE3("REFETCH %d
a400: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
a410: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
a420: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
a430: 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b 0a  if( rc ) break;.
a440: 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
a450: 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e 70  er, zBuf, pPg->p
a460: 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65 6c  gno, 2);.    }el
a470: 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  se{.      memset
a480: 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65 72  (zBuf, 0, pPager
a490: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a4a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
a4b0: 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63 6d  nRef==0 || memcm
a4c0: 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54 4f  p(zBuf, PGHDR_TO
a4d0: 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67  _DATA(pPg), pPag
a4e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
a4f0: 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47  .      memcpy(PG
a500: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
a510: 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
a520: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a530: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65   if( pPager->xRe
a540: 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20  initer ){.      
a550: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
a560: 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ter(PGHDR_TO_DAT
a570: 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
a580: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
a590: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a5a0: 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
a5b0: 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
a5c0: 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e  r), 0, pPager->n
a5d0: 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d 0a  Extra);.      }.
a5e0: 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 6e      }.    pPg->n
a5f0: 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
a600: 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
a610: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
a620: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
a630: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
a640: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
a650: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  g);.#endif.  }. 
a660: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
a670: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
a680: 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20 74  e main file of t
a690: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20 74  he given pager t
a6a0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
a6b0: 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61 74  pages.** indicat
a6c0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a6d0: 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  t pager_truncate
a6e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
a6f0: 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  int nPage){.  as
a700: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
a710: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
a720: 53 49 56 45 20 29 3b 0a 20 20 72 65 74 75 72 6e  SIVE );.  return
a730: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
a740: 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  te(&pPager->fd, 
a750: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
a760: 2a 28 69 36 34 29 6e 50 61 67 65 29 3b 0a 7d 0a  *(i64)nPage);.}.
a770: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
a780: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
a790: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
a7a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
a7b0: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
a7c0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
a7d0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
a7e0: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
a7f0: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
a800: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
a810: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
a820: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
a830: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
a840: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
a850: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
a860: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
a870: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
a880: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
a890: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
a8a0: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
a8b0: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
a8c0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
a8d0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
a8e0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
a8f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
a900: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
a910: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
a920: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
a930: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
a940: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
a950: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
a960: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
a970: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
a980: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
a990: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
a9a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
a9b0: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
a9c0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
a9d0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
a9e0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
a9f0: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
aa00: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
aa10: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
aa20: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
aa30: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
aa40: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
aa50: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
aa60: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
aa70: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
aa80: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
aa90: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
aaa0: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
aab0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
aac0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
aad0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
aae0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
aaf0: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
ab00: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
ab10: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
ab20: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
ab30: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
ab40: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
ab50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
ab60: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
ab70: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
ab80: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
ab90: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
aba0: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
abb0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
abc0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
abd0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
abe0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
abf0: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
ac00: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
ac10: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
ac20: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
ac30: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
ac40: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
ac50: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
ac60: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
ac70: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
ac80: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
ac90: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
aca0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
acb0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
acc0: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
acd0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
ace0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
acf0: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
ad00: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
ad10: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
ad20: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
ad30: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
ad40: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
ad50: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
ad60: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
ad70: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
ad80: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
ad90: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
ada0: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
adb0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
adc0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
add0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
ade0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
adf0: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
ae00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
ae10: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
ae20: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
ae30: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
ae40: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
ae50: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
ae60: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
ae70: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
ae80: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
ae90: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
aea0: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
aeb0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
aec0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
aed0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
aee0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
aef0: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
af00: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
af10: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
af20: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
af30: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
af40: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
af50: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
af60: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
af70: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
af80: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
af90: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
afa0: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
afb0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
afc0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
afd0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
afe0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
aff0: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
b000: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
b010: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
b020: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
b030: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
b040: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
b050: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
b060: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
b070: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
b080: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b090: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
b0a0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
b0b0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
b0c0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
b0d0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
b0e0: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
b0f0: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
b100: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
b110: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
b120: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
b130: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
b140: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
b150: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
b160: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
b170: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
b180: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
b190: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
b1a0: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
b1b0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
b1c0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
b1d0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
b1e0: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
b1f0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
b200: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
b210: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
b220: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b230: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
b240: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b250: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
b260: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
b270: 20 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20   */.  u32 nRec; 
b280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b290: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f  * Number of Reco
b2a0: 72 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  rds in the journ
b2b0: 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  al */.  int i;  
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b2e0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20   */.  Pgno mxPg 
b2f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
b300: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72  * Size of the or
b310: 69 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70  iginal file in p
b320: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ages */.  int rc
b330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b340: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
b350: 65 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e  e of a subroutin
b360: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  e */.  char *zMa
b370: 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20  ster = 0;       
b380: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65  /* Name of maste
b390: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
b3a0: 66 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46  f any */..  /* F
b3b0: 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
b3c0: 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
b3d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  n the journal.  
b3e0: 41 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20  Abort early if. 
b3f0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
b400: 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20  is empty..  */. 
b410: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
b420: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a  >journalOpen );.
b430: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b440: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
b450: 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20  ->jfd, &szJ);.  
b460: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b470: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  K ){.    goto en
b480: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
b490: 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6d  .  /* Read the m
b4a0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
b4b0: 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  me from the jour
b4c0: 6e 61 6c 2c 20 69 66 20 69 74 20 69 73 20 70 72  nal, if it is pr
b4d0: 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61  esent..  ** If a
b4e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
b4f0: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 73 70 65  file name is spe
b500: 63 69 66 69 65 64 2c 20 62 75 74 20 74 68 65 20  cified, but the 
b510: 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  file is not.  **
b520: 20 70 72 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b   present on disk
b530: 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
b540: 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e  al is not hot an
b550: 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  d does not need 
b560: 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65  to be.  ** playe
b570: 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  d back..  */.  r
b580: 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  c = readMasterJo
b590: 75 72 6e 61 6c 28 26 70 50 61 67 65 72 2d 3e 6a  urnal(&pPager->j
b5a0: 66 64 2c 20 26 7a 4d 61 73 74 65 72 29 3b 0a 20  fd, &zMaster);. 
b5b0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
b5c0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69 66  ITE_DONE );.  if
b5d0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b5e0: 7c 7c 20 28 7a 4d 61 73 74 65 72 20 26 26 20 21  || (zMaster && !
b5f0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
b600: 73 74 73 28 7a 4d 61 73 74 65 72 29 29 20 29 7b  sts(zMaster)) ){
b610: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
b620: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
b630: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
b640: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
b650: 4e 45 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45  NE ) rc = SQLITE
b660: 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  _OK;.    goto en
b670: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  d_playback;.  }.
b680: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
b690: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  &pPager->jfd, 0)
b6a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
b6b0: 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 2f  nalOff = 0;..  /
b6c0: 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
b6d0: 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
b6e0: 65 6e 20 74 68 65 20 72 65 61 64 4a 6f 75 72 6e  en the readJourn
b6f0: 61 6c 48 64 72 28 29 20 63 61 6c 6c 20 72 65 74  alHdr() call ret
b700: 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c 49 54 45  urns.  ** SQLITE
b710: 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49 4f 20 65  _DONE or an IO e
b720: 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a  rror occurs. */.
b730: 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 0a 20    while( 1 ){.. 
b740: 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e     /* Read the n
b750: 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ext journal head
b760: 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  er from the jour
b770: 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68  nal file.  If th
b780: 65 72 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e  ere are.    ** n
b790: 6f 74 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20  ot enough bytes 
b7a0: 6c 65 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  left in the jour
b7b0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63  nal file for a c
b7c0: 6f 6d 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20  omplete header, 
b7d0: 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20  or.    ** it is 
b7e0: 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
b7f0: 61 20 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f  a process must o
b800: 66 20 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77  f failed while w
b810: 72 69 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a  riting it..    *
b820: 2a 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  * This indicates
b830: 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65   nothing more ne
b840: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
b850: 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20   back..    */.  
b860: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
b870: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
b880: 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78 50 67 29  J, &nRec, &mxPg)
b890: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b8a0: 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20 20 20 20  LITE_OK ){ .    
b8b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b8c0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
b8d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
b8e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
b8f0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
b900: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b910: 49 66 20 6e 52 65 63 20 69 73 20 30 78 66 66 66  If nRec is 0xfff
b920: 66 66 66 66 66 2c 20 74 68 65 6e 20 74 68 69 73  fffff, then this
b930: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 63 72 65   journal was cre
b940: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
b950: 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b 69 6e 67  s.    ** working
b960: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
b970: 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  . This means tha
b980: 74 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  t the rest of th
b990: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  e journal.    **
b9a0: 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20 6f   file consists o
b9b0: 66 20 70 61 67 65 73 2c 20 74 68 65 72 65 20 61  f pages, there a
b9c0: 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e  re no more journ
b9d0: 61 6c 20 68 65 61 64 65 72 73 2e 20 43 6f 6d 70  al headers. Comp
b9e0: 75 74 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 76  ute.    ** the v
b9f0: 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 62 61 73  alue of nRec bas
ba00: 65 64 20 6f 6e 20 74 68 69 73 20 61 73 73 75 6d  ed on this assum
ba10: 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
ba20: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 78 66 66    if( nRec==0xff
ba30: 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 20 20  ffffff ){.      
ba40: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ba50: 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52  journalOff==JOUR
ba60: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
ba70: 72 29 20 29 3b 0a 20 20 20 20 20 20 6e 52 65 63  r) );.      nRec
ba80: 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41   = (szJ - JOURNA
ba90: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
baa0: 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
bab0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  pPager);.    }..
bac0: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
bad0: 73 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64  s the first head
bae0: 65 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  er read from the
baf0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61   journal, trunca
bb00: 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61  te the.    ** da
bb10: 74 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b  tabase file back
bb20: 20 74 6f 20 69 74 27 73 20 6f 72 69 67 69 6e 61   to it's origina
bb30: 6c 20 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20  l size..    */. 
bb40: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
bb50: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
bb60: 55 53 49 56 45 20 26 26 20 0a 20 20 20 20 20 20  USIVE && .      
bb70: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
bb80: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
bb90: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
bba0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
bbb0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
bbc0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
bbd0: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
bbe0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
bbf0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
bc00: 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
bc10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bc20: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
bc30: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
bc40: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
bc50: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
bc60: 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
bc70: 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69 74 65    /* rc = sqlite
bc80: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
bc90: 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f 48 44  >jfd, JOURNAL_HD
bca0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 20 2a  R_SZ(pPager)); *
bcb0: 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  /.    if( rc!=SQ
bcc0: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
bcd0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 0a  nd_playback;.  .
bce0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
bcf0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
bd00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
bd10: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
bd20: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
bd30: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
bd40: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
bd50: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
bd60: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
bd70: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
bd80: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
bd90: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bda0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
bdb0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
bdc0: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
bdd0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
bde0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
bdf0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
be00: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
be10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
be20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
be30: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
be40: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
be50: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
be60: 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20    /* Pages that 
be70: 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
be80: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
be90: 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65   but never synce
bea0: 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74  d.  ** where not
beb0: 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68 65   restored by the
bec0: 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65   loop above.  We
bed0: 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65   have to restore
bee0: 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65   those.  ** page
bef0: 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  s by reading the
bf00: 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  m back from the 
bf10: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
bf20: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
bf30: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
bf40: 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c 6f 61  );.  pager_reloa
bf50: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
bf60: 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
bf70: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
bf80: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
bf90: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
bfa0: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
bfb0: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
bfc0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
bfd0: 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
bfe0: 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
bff0: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
c000: 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73  n true,.    ** s
c010: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
c020: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
c030: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
c040: 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  l..    */.    if
c050: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
c060: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
c070: 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d  ger_delmaster(zM
c080: 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  aster);.    }.  
c090: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
c0a0: 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
c0b0: 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
c0c0: 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
c0d0: 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
c0e0: 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
c0f0: 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
c100: 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
c110: 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
c120: 20 61 20 64 69 66 66 65 72 65 6e 74 20 50 41 47   a different PAG
c130: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20  ER_SECTOR_SIZE. 
c140: 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
c150: 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
c160: 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
c170: 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
c180: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
c190: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
c1a0: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75  TOR_SIZE;.  retu
c1b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
c1c0: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
c1d0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
c1e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
c1f0: 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
c200: 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
c210: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
c220: 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
c230: 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
c240: 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
c250: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
c260: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
c270: 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
c280: 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
c290: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
c2a0: 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
c2b0: 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
c2c0: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
c2d0: 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
c2e0: 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
c2f0: 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
c300: 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
c310: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
c320: 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
c330: 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
c340: 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
c350: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
c360: 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
c370: 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
c380: 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
c390: 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
c3a0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
c3b0: 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
c3c0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
c3d0: 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
c3e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
c3f0: 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
c400: 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
c410: 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
c420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c430: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
c440: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
c450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c460: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
c470: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
c480: 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
c490: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64  ournalOff;.#ifnd
c4a0: 65 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20  ef NDEBUG .  {. 
c4b0: 20 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20     i64 os_szJ;. 
c4c0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c4d0: 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65  sFileSize(&pPage
c4e0: 72 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29  r->jfd, &os_szJ)
c4f0: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
c500: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
c510: 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
c520: 20 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a   szJ==os_szJ );.
c530: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
c540: 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
c550: 65 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  e the offset to 
c560: 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
c570: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
c580: 0a 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65  .  ** this state
c590: 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
c5a0: 2c 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20  , or the end of 
c5b0: 74 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a  the file if no j
c5c0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64  ournal.  ** head
c5d0: 65 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a  er was written..
c5e0: 20 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20    */.  hdrOff = 
c5f0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f  pPager->stmtHdrO
c600: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ff;.  assert( pP
c610: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c  ager->fullSync |
c620: 7c 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69  | !hdrOff );.  i
c630: 66 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20  f( !hdrOff ){.  
c640: 20 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a    hdrOff = szJ;.
c650: 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e    }.  .  /* Trun
c660: 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
c670: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
c680: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
c690: 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
c6a0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
c6b0: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 72 63  LUSIVE ){.    rc
c6c0: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
c6d0: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
c6e0: 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20 7d  ->stmtSize);.  }
c6f0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
c700: 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  e = pPager->stmt
c710: 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75  Size;..  /* Figu
c720: 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20  re out how many 
c730: 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74  records are in t
c740: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
c750: 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  rnal..  */.  ass
c760: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
c770: 74 49 6e 55 73 65 20 26 26 20 70 50 61 67 65 72  tInUse && pPager
c780: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
c790: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b  .  sqlite3OsSeek
c7a0: 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
c7b0: 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61  0);.  nRec = pPa
c7c0: 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
c7d0: 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
c7e0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
c7f0: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
c800: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
c810: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
c820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
c830: 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
c840: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
c850: 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
c860: 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
c870: 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
c880: 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
c890: 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
c8a0: 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
c8b0: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
c8c0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63   */.  for(i=nRec
c8d0: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
c8e0: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
c8f0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
c900: 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72  (pPager, &pPager
c910: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 20 20  ->stfd, 0);.    
c920: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
c930: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69  TE_DONE );.    i
c940: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c950: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74   ) goto end_stmt
c960: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a  _playback;.  }..
c970: 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f    /* Now roll so
c980: 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20 66 72  me pages back fr
c990: 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  om the transacti
c9a0: 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65  on journal. Page
c9b0: 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a  r.stmtJSize.  **
c9c0: 20 77 61 73 20 74 68 65 20 73 69 7a 65 20 6f 66   was the size of
c9d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c9e0: 65 20 77 68 65 6e 20 74 68 69 73 20 73 74 61 74  e when this stat
c9f0: 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72 74 65  ement was starte
ca00: 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79  d, so.  ** every
ca10: 74 68 69 6e 67 20 61 66 74 65 72 20 74 68 61 74  thing after that
ca20: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
ca30: 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68 65 72  led back, either
ca40: 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
ca50: 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d 65 6d  atabase, the mem
ca60: 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20 62 6f  ory cache, or bo
ca70: 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  th..  **.  ** If
ca80: 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c   it is not zero,
ca90: 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74 6d 74   then Pager.stmt
caa0: 48 64 72 4f 66 66 20 69 73 20 74 68 65 20 6f 66  HdrOff is the of
cab0: 66 73 65 74 20 74 6f 20 74 68 65 20 73 74 61 72  fset to the star
cac0: 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69  t.  ** of the fi
cad0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
cae0: 65 72 20 77 72 69 74 74 65 6e 20 64 75 72 69 6e  er written durin
caf0: 67 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  g this statement
cb00: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
cb10: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
cb20: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
cb30: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 74  >jfd, pPager->st
cb40: 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
cb50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cb60: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74  .    goto end_st
cb70: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
cb80: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
cb90: 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  alOff = pPager->
cba0: 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61  stmtJSize;.  pPa
cbb0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d  ger->cksumInit =
cbc0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
cbd0: 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20 4a 4f  um;.  assert( JO
cbe0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
cbf0: 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e 70 61  ger)<(pPager->pa
cc00: 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77  geSize+8) );.  w
cc10: 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
cc20: 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72  urnalOff <= (hdr
cc30: 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70 61 67  Off-(pPager->pag
cc40: 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20  eSize+8)) ){.   
cc50: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
cc60: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
cc70: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
cc80: 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  fd, 1);.    asse
cc90: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
cca0: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
ccb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
ccc0: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
ccd0: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
cce0: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
ccf0: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
cd00: 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b 0a 20  .    u32 nRec;. 
cd10: 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
cd20: 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e    rc = readJourn
cd30: 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73 7a  alHdr(pPager, sz
cd40: 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d 6d 79  J, &nRec, &dummy
cd50: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
cd60: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
cd70: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
cd80: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
cd90: 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74     goto end_stmt
cda0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
cdb0: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
cdc0: 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
cdd0: 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e   (szJ - pPager->
cde0: 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70  journalOff) / (p
cdf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
ce00: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  8);.    }.    fo
ce10: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
ce20: 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
ce30: 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d  nalOff < szJ; i-
ce40: 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  -){.      rc = p
ce50: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
ce60: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
ce70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
ce80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
ce90: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
cea0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
ceb0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
cec0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
ced0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ck;.    }.  }.. 
cee0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cef0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e  Off = szJ;.  .en
cf00: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a  d_stmt_playback:
cf10: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
cf20: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67  E_OK ){.    pPag
cf30: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50  er->errMask |= P
cf40: 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54  AGER_ERR_CORRUPT
cf50: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
cf60: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 65 6c  E_CORRUPT;.  }el
cf70: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
cf80: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
cf90: 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72  ;.    /* pager_r
cfa0: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
cfb0: 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  er); */.  }.  re
cfc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
cfd0: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
cfe0: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
cff0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
d000: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
d010: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
d020: 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73  pager_set_caches
d030: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
d040: 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  r, int mxPage){.
d050: 20 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20    if( mxPage>10 
d060: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
d070: 78 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a  xPage = mxPage;.
d080: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
d090: 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30  ger->mxPage = 10
d0a0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
d0b0: 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74  djust the robust
d0c0: 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61  ness of the data
d0d0: 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64  base to damage d
d0e0: 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73  ue to OS crashes
d0f0: 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69  .** or power fai
d100: 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e  lures by changin
d110: 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  g the number of 
d120: 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72  syncs()s when wr
d130: 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c  iting.** the rol
d140: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20  lback journal.  
d150: 54 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20  There are three 
d160: 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  levels:.**.**   
d170: 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74   OFF       sqlit
d180: 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  e3OsSync() is ne
d190: 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69  ver called.  Thi
d1a0: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
d1b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d1c0: 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61   for temporary a
d1d0: 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c  nd transient fil
d1e0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52  es..**.**    NOR
d1f0: 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e  MAL    The journ
d200: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63  al is synced onc
d210: 65 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20  e before writes 
d220: 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20  begin on the.** 
d230: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
d240: 61 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20  abase.  This is 
d250: 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74  normally adequat
d260: 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75  e protection, bu
d270: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
d280: 20 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69    it is theoreti
d290: 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20  cally possible, 
d2a0: 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69  though very unli
d2b0: 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20  kely,.**        
d2c0: 20 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e        that an in
d2d0: 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66  opertune power f
d2e0: 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61  ailure could lea
d2f0: 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  ve the journal.*
d300: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  *              i
d310: 6e 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20  n a state which 
d320: 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61  would cause dama
d330: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
d340: 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  se.**           
d350: 20 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f     when it is ro
d360: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a  lled back..**.**
d370: 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68      FULL      Th
d380: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
d390: 63 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65  ced twice before
d3a0: 20 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e   writes begin on
d3b0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
d3c0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77       database (w
d3d0: 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f  ith some additio
d3e0: 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nal information 
d3f0: 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  - the nRec field
d400: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d410: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
d420: 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77  header - being w
d430: 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65  ritten in betwee
d440: 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20  n the two.**    
d450: 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29            syncs)
d460: 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20  .  If we assume 
d470: 74 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a  that writing a.*
d480: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  *              s
d490: 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
d4a0: 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65  r is atomic, the
d4b0: 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76  n this mode prov
d4c0: 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  ides.**         
d4d0: 20 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74       assurance t
d4e0: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
d4f0: 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72  will not be corr
d500: 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20  upted to the.** 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69               poi
d520: 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61  nt of causing da
d530: 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
d540: 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  base during roll
d550: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65  back..**.** Nume
d560: 72 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63  ric values assoc
d570: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65  iated with these
d580: 20 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d   states are OFF=
d590: 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a  =1, NORMAL=2,.**
d5a0: 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a   and FULL=3..*/.
d5b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d5c0: 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41  MIT_PAGER_PRAGMA
d5d0: 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  S.void sqlite3pa
d5e0: 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c  ger_set_safety_l
d5f0: 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
d600: 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a  er, int level){.
d610: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
d620: 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
d630: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
d640: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
d650: 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
d660: 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
d670: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67  File;.  if( pPag
d680: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
d690: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
d6a0: 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
d6b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
d6c0: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
d6d0: 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
d6e0: 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
d6f0: 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
d700: 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
d710: 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
d720: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
d730: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
d740: 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
d750: 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 69 6e 74 20   only.  .*/.int 
d760: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
d770: 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  _count = 0;../*.
d780: 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
d790: 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ary file.  Write
d7a0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d7b0: 20 66 69 6c 65 20 69 6e 74 6f 20 7a 46 69 6c 65   file into zFile
d7c0: 0a 2a 2a 20 28 7a 46 69 6c 65 20 6d 75 73 74 20  .** (zFile must 
d7d0: 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49  be at least SQLI
d7e0: 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45  TE_TEMPNAME_SIZE
d7f0: 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57   bytes long.)  W
d800: 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65  rite.** the file
d810: 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f   descriptor into
d820: 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51   *fd.  Return SQ
d830: 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
d840: 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74  ss or some.** ot
d850: 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69  her error code i
d860: 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a  f we fail..**.**
d870: 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74   The OS will aut
d880: 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
d890: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
d8a0: 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a  file when it is.
d8b0: 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74  ** closed..*/.st
d8c0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
d8d0: 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63  pager_opentemp(c
d8e0: 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69  har *zFile, OsFi
d8f0: 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63  le *fd){.  int c
d900: 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63  nt = 8;.  int rc
d910: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
d920: 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
d930: 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
d940: 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
d950: 6f 6e 6c 79 20 2a 2f 0a 20 20 64 6f 7b 0a 20 20  only */.  do{.  
d960: 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71 6c    cnt--;.    sql
d970: 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e 61  ite3OsTempFileNa
d980: 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 72  me(zFile);.    r
d990: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
d9a0: 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c 65  nExclusive(zFile
d9b0: 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68 69  , fd, 1);.  }whi
d9c0: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
d9d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
d9e0: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
d9f0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
da00: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
da10: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
da20: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
da30: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
da40: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
da50: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
da60: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
da70: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
da80: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
da90: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
daa0: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
dab0: 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
dac0: 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64  and is only held
dad0: 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a   open until the.
dae0: 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20  ** last page is 
daf0: 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73  released using s
db00: 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
db10: 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  f()..**.** If zF
db20: 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20  ilename is NULL 
db30: 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d  then a randomly-
db40: 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20  named temporary 
db50: 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a  file is created.
db60: 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20 74  ** and used as t
db70: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
db80: 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20  ched.  The file 
db90: 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a  will be deleted.
dba0: 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
dbb0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
dbc0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69  ed..**.** If zFi
dbd0: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
dbe0: 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e  ry:" then all in
dbf0: 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c  formation is hel
dc00: 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49  d in cache..** I
dc10: 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74 74  t is never writt
dc20: 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69  en to disk.  Thi
dc30: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
dc40: 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a   implement an.**
dc50: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
dc60: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
dc70: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a 20  te3pager_open(. 
dc80: 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
dc90: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
dca0: 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
dcb0: 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
dcc0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
dcd0: 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
dce0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
dcf0: 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
dd00: 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd20: 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
dd30: 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
dd40: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
dd50: 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20 20  int flags       
dd60: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
dd70: 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
dd80: 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20  is file */.){.  
dd90: 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
dda0: 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74 68   char *zFullPath
ddb0: 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  name = 0;.  int 
ddc0: 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c  nameLen;.  OsFil
ddd0: 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  e fd;.  int rc =
dde0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
ddf0: 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46  t i;.  int tempF
de00: 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d  ile = 0;.  int m
de10: 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20  emDb = 0;.  int 
de20: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
de30: 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d  int useJournal =
de40: 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f   (flags & PAGER_
de50: 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30  OMIT_JOURNAL)==0
de60: 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f  ;.  int noReadlo
de70: 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41  ck = (flags & PA
de80: 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29  GER_NO_READLOCK)
de90: 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  !=0;.  char zTem
dea0: 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
deb0: 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50  E_SIZE];..  *ppP
dec0: 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  ager = 0;.  mems
ded0: 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f  et(&fd, 0, sizeo
dee0: 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71  f(fd));.  if( sq
def0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
df00: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
df10: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
df20: 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e    }.  if( zFilen
df30: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
df40: 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  [0] ){.#ifndef S
df50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
df60: 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72 63  YDB.    if( strc
df70: 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d  mp(zFilename,":m
df80: 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20  emory:")==0 ){. 
df90: 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a       memDb = 1;.
dfa0: 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e        zFullPathn
dfb0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
dfc0: 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63  up("");.      rc
dfd0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
dfe0: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20    }else.#endif. 
dff0: 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c     {.      zFull
e000: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
e010: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
e020: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
e030: 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68     if( zFullPath
e040: 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20  name ){.        
e050: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
e060: 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c  enReadWrite(zFul
e070: 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20  lPathname, &fd, 
e080: 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20  &readOnly);.    
e090: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
e0a0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
e0b0: 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
e0c0: 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20  p(zTemp, &fd);. 
e0d0: 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a     zFilename = z
e0e0: 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50  Temp;.    zFullP
e0f0: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
e100: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
e110: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
e120: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
e130: 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46  K ){.      tempF
e140: 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ile = 1;.    }. 
e150: 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c 50   }.  if( !zFullP
e160: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73  athname ){.    s
e170: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
e180: 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  d);.    return S
e190: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
e1a0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e1b0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
e1c0: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
e1d0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
e1e0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
e1f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e200: 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73   }.  nameLen = s
e210: 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e  trlen(zFullPathn
e220: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d  ame);.  pPager =
e230: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
e240: 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b  izeof(*pPager) +
e250: 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20   nameLen*3 + 30 
e260: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d  );.  if( pPager=
e270: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
e280: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
e290: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
e2a0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
e2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
e2c0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41  NOMEM;.  }.  TRA
e2d0: 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE3("OPEN %d %s\
e2e0: 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
e2f0: 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  (fd), zFullPathn
e300: 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ame);.  pPager->
e310: 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61  zFilename = (cha
e320: 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20  r*)&pPager[1];. 
e330: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e340: 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a  ory = &pPager->z
e350: 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e  Filename[nameLen
e360: 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  +1];.  pPager->z
e370: 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65  Journal = &pPage
e380: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61  r->zDirectory[na
e390: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63  meLen+1];.  strc
e3a0: 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
e3b0: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
e3c0: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70  ame);.  strcpy(p
e3d0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
e3e0: 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  y, zFullPathname
e3f0: 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c  );.  for(i=nameL
e400: 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65  en; i>0 && pPage
e410: 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d  r->zDirectory[i-
e420: 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a  1]!='/'; i--){}.
e430: 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61 67    if( i>0 ) pPag
e440: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
e450: 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70  -1] = 0;.  strcp
e460: 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
e470: 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  al, zFullPathnam
e480: 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  e);.  sqliteFree
e490: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
e4a0: 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67 65  .  strcpy(&pPage
e4b0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65  r->zJournal[name
e4c0: 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  Len], "-journal"
e4d0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20  );.  pPager->fd 
e4e0: 3d 20 66 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49  = fd;.#if OS_UNI
e4f0: 58 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 2e 70  X.  pPager->fd.p
e500: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
e510: 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
e520: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30  >journalOpen = 0
e530: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  ;.  pPager->useJ
e540: 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
e550: 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
e560: 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
e570: 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
e580: 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
e590: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
e5a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e5b0: 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
e5c0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20   pPager->nRef = 
e5d0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  0;.  pPager->dbS
e5e0: 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20  ize = memDb-1;. 
e5f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e600: 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
e610: 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20  LT_PAGE_SIZE;.  
e620: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
e630: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
e640: 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20  stmtJSize = 0;. 
e650: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d   pPager->nPage =
e660: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d   0;.  pPager->nM
e670: 61 78 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  axPage = 0;.  pP
e680: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
e690: 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  00;.  pPager->st
e6a0: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
e6b0: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
e6c0: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
e6d0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
e6e0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
e6f0: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
e700: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
e710: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
e720: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
e730: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
e740: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
e750: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
e760: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
e770: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
e780: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
e790: 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
e7a0: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
e7b0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
e7c0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
e7d0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
e7e0: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
e7f0: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
e800: 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50  NT(nExtra);.  pP
e810: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
e820: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
e830: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
e840: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
e850: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
e860: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
e870: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
e880: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
e890: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
e8a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
e8b0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
e8c0: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
e8d0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
e8e0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
e8f0: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
e900: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
e910: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
e920: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
e930: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
e940: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
e950: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
e960: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
e970: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
e980: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
e990: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
e9a0: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
e9b0: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
e9c0: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
e9d0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
e9e0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
e9f0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
ea00: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
ea10: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
ea20: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
ea30: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
ea40: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
ea50: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
ea60: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
ea70: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
ea80: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
ea90: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
eaa0: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
eab0: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
eac0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ead0: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
eae0: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
eaf0: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
eb00: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
eb10: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
eb20: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
eb30: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
eb40: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
eb50: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
eb60: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
eb70: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
eb80: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
eb90: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
eba0: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
ebb0: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
ebc0: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
ebd0: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
ebe0: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
ebf0: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
ec00: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
ec10: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
ec20: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
ec30: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
ec40: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
ec50: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
ec60: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
ec70: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
ec80: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
ec90: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
eca0: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
ecb0: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
ecc0: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
ecd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
ece0: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65  e page size.  Re
ecf0: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a  turn the new siz
ed00: 65 2e 20 20 49 66 20 74 68 65 20 73 75 67 67 65  e.  If the sugge
ed10: 73 74 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73  st new page.** s
ed20: 69 7a 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72  ize is inappropr
ed30: 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c  iate, then an al
ed40: 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73  ternative page s
ed50: 69 7a 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a  ize is selected.
ed60: 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e  ** and returned.
ed70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
ed80: 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a  ager_set_pagesiz
ed90: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
eda0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a   int pageSize){.
edb0: 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69    assert( pageSi
edc0: 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53  ze>=512 && pageS
edd0: 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  ize<=SQLITE_MAX_
ede0: 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 69  PAGE_SIZE );.  i
edf0: 66 28 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44  f( !pPager->memD
ee00: 62 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  b ){.    pPager-
ee10: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
ee20: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Size;.  }.  retu
ee30: 72 6e 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  rn pPager->pageS
ee40: 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ize;.}../*.** Re
ee50: 61 64 20 74 68 65 20 66 69 72 73 74 20 4e 20 62  ad the first N b
ee60: 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65  ytes from the be
ee70: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66  ginning of the f
ee80: 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a  ile into memory.
ee90: 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20 70 6f  ** that pDest po
eea0: 69 6e 74 73 20 74 6f 2e 20 20 4e 6f 20 65 72 72  ints to.  No err
eeb0: 6f 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64  or checking is d
eec0: 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  one..*/.void sql
eed0: 69 74 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66  ite3pager_read_f
eee0: 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
eef0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
ef00: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
ef10: 44 65 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28  Dest){.  memset(
ef20: 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20  pDest, 0, N);.  
ef30: 69 66 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a  if( MEMDB==0 ){.
ef40: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
ef50: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30  k(&pPager->fd, 0
ef60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
ef70: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
ef80: 2c 20 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d  , pDest, N);.  }
ef90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
efa0: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
efb0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
efc0: 65 20 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f  e disk file asso
efd0: 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70  ciated with.** p
efe0: 50 61 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66  Pager. .**.** If
eff0: 20 74 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54   the PENDING_BYT
f000: 45 20 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61  E lies on the pa
f010: 67 65 20 64 69 72 65 63 74 6c 79 20 61 66 74 65  ge directly afte
f020: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
f030: 0a 2a 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63  .** file, then c
f040: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 70 61 67  onsider this pag
f050: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 69  e part of the fi
f060: 6c 65 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d  le too. For exam
f070: 70 6c 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49  ple, if.** PENDI
f080: 4e 47 5f 42 59 54 45 20 69 73 20 62 79 74 65 20  NG_BYTE is byte 
f090: 34 30 39 36 20 28 74 68 65 20 66 69 72 73 74 20  4096 (the first 
f0a0: 62 79 74 65 20 6f 66 20 70 61 67 65 20 35 29 20  byte of page 5) 
f0b0: 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
f0c0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34  the.** file is 4
f0d0: 30 39 36 20 62 79 74 65 73 2c 20 35 20 69 73 20  096 bytes, 5 is 
f0e0: 72 65 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64  returned instead
f0f0: 20 6f 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71   of 4..*/.int sq
f100: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
f110: 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  ount(Pager *pPag
f120: 65 72 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20  er){.  i64 n;.  
f130: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
f140: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
f150: 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a  r->dbSize>=0 ){.
f160: 20 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e      n = pPager->
f170: 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65  dbSize;.  } else
f180: 20 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   {.    if( sqlit
f190: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
f1a0: 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53  ager->fd, &n)!=S
f1b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f1c0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73    pPager->errMas
f1d0: 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44  k |= PAGER_ERR_D
f1e0: 49 53 4b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ISK;.      retur
f1f0: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
f200: 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
f210: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
f220: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
f230: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
f240: 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
f250: 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
f260: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
f270: 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
f280: 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
f290: 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  dbSize = n;.    
f2a0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28  }.  }.  if( n==(
f2b0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
f2c0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
f2d0: 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
f2e0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
f2f0: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
f300: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
f310: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
f320: 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a  l(Pager*);.../*.
f330: 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  ** Unlink pPg fr
f340: 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
f350: 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65  in. Also set the
f360: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
f370: 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a  0 to indicate.**
f380: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
f390: 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  s not part of an
f3a0: 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68  y hash chain. Th
f3b0: 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  is is required b
f3c0: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71  ecause the.** sq
f3d0: 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
f3e0: 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
f3f0: 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
f400: 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
f410: 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
f420: 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
f430: 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
f440: 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
f450: 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
f460: 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
f470: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
f480: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
f490: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  gno==0 ){.    /*
f4a0: 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
f4b0: 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ber is zero, the
f4c0: 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6e  n this page is n
f4d0: 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63  ot in any hash c
f4e0: 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  hain. */.    ret
f4f0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
f500: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
f510: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
f520: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
f530: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
f540: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
f550: 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
f560: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f570: 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73  >aHash[pager_has
f580: 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70  h(pPg->pgno)]!=p
f590: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
f5a0: 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
f5b0: 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
f5c0: 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
f5d0: 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72     int h = pager
f5e0: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
f5f0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
f600: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d  ager->aHash[h]==
f610: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
f620: 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
f630: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
f640: 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  }..  pPg->pgno =
f650: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
f660: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
f670: 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
f680: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
f690: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
f6a0: 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
f6b0: 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
f6c0: 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
f6d0: 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
f6e0: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
f6f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f700: 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
f710: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
f720: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
f730: 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
f740: 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
f750: 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
f760: 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
f770: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
f780: 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
f790: 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
f7a0: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
f7b0: 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
f7c0: 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
f7d0: 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
f7e0: 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
f7f0: 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
f800: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
f810: 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
f820: 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
f830: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
f840: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
f850: 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
f860: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
f870: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
f880: 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
f890: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f8a0: 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
f8b0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
f8c0: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
f8d0: 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
f8e0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
f8f0: 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
f900: 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
f910: 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
f920: 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
f930: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f940: 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
f950: 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
f960: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
f970: 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
f980: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
f990: 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
f9a0: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
f9b0: 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
f9c0: 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
f9d0: 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
f9e0: 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pPg);.}..#ifnde
f9f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
fa00: 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69  MORYDB./*.** Thi
fa10: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
fa20: 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e  d to truncate an
fa30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
fa40: 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20  ase.  Delete.** 
fa50: 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
fa60: 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74  pgno is larger t
fa70: 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
fa80: 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
fa90: 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72  renced..** Refer
faa0: 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
fab0: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
fac0: 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
fad0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
fae0: 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  d memoryTruncate
faf0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
fb00: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
fb10: 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
fb20: 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
fb30: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
fb40: 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
fb50: 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
fb60: 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
fb70: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
fb80: 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
fb90: 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
fba0: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
fbb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
fbc0: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
fbd0: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
fbe0: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
fbf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
fc00: 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
fc10: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
fc20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc30: 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
fc40: 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c  xtAll;.      unl
fc50: 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
fc60: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
fc70: 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
fc80: 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
fc90: 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
fca0: 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e  efine memoryTrun
fcb0: 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a  cate(p).#endif..
fcc0: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
fcd0: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
fce0: 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
fcf0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
fd00: 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
fd10: 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
fd20: 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
fd30: 61 74 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73  at until the bus
fd40: 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72  y callback retur
fd50: 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75  ns.** false or u
fd60: 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75  ntil the lock su
fd70: 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65  cceeds..**.** Re
fd80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
fd90: 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e  n success and an
fda0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77   error code if w
fdb0: 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a  e cannot obtain.
fdc0: 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a  ** the lock..*/.
fdd0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
fde0: 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
fdf0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
fe00: 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
fe10: 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
fe20: 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48  PAGER_SHARED==SH
fe30: 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
fe40: 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53  ssert( PAGER_RES
fe50: 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f  ERVED==RESERVED_
fe60: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
fe70: 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  ( PAGER_EXCLUSIV
fe80: 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  E==EXCLUSIVE_LOC
fe90: 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
fea0: 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74 79  r->state>=lockty
feb0: 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  pe ){.    rc = S
fec0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
fed0: 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  e{.    do {.    
fee0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
fef0: 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
ff00: 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20  , locktype);.   
ff10: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
ff20: 49 54 45 5f 42 55 53 59 20 26 26 20 73 71 6c 69  ITE_BUSY && sqli
ff30: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
ff40: 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
ff50: 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a 20 20  syHandler) );.  
ff60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
ff70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  _OK ){.      pPa
ff80: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63  ger->state = loc
ff90: 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  ktype;.    }.  }
ffa0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
ffb0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
ffc0: 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20  the file to the 
ffd0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
ffe0: 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e  specified..*/.in
fff0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74  t sqlite3pager_t
10000 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
10010 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67  Pager, Pgno nPag
10020 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
10030 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
10040 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
10050 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
10060 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20  rMask!=0 ){.    
10070 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f  rc = pager_errco
10080 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  de(pPager);.    
10090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
100a0 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73   if( nPage>=(uns
100b0 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62  igned)pPager->db
100c0 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
100d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
100e0 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  }.  if( MEMDB ){
100f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
10100 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
10110 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
10120 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
10130 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
10140 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f   }.  rc = syncJo
10150 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
10160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10170 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10180 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47   rc;.  }..  /* G
10190 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
101a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
101b0 62 61 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e  base before trun
101c0 63 61 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20  cating. */.  rc 
101d0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
101e0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
101f0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
10200 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10210 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
10220 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rc;.  }..  rc = 
10230 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
10240 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
10250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10260 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
10270 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
10280 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
10290 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74  c;.}../*.** Shut
102a0 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63 61  down the page ca
102b0 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d  che.  Free all m
102c0 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20  emory and close 
102d0 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  all files..**.**
102e0 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
102f0 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73  n was in progres
10300 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  s when this rout
10310 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
10320 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  hat.** transacti
10330 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
10340 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64  k.  All outstand
10350 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
10360 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64  validated.** and
10370 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73   their memory is
10380 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74   freed.  Any att
10390 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70 61  empt to use a pa
103a0 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ge associated.**
103b0 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65 20   with this page 
103c0 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69 73  cache after this
103d0 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
103e0 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a  s will likely.**
103f0 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72   result in a cor
10400 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  edump..*/.int sq
10410 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65  lite3pager_close
10420 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10430 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a  .  PgHdr *pPg, *
10440 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28  pNext;.  switch(
10450 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29   pPager->state )
10460 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52  {.    case PAGER
10470 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63  _RESERVED:.    c
10480 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44  ase PAGER_SYNCED
10490 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  : .    case PAGE
104a0 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20  R_EXCLUSIVE: {. 
104b0 20 20 20 20 20 2f 2a 20 57 65 20 69 67 6e 6f 72       /* We ignor
104c0 65 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 73 20  e any IO errors 
104d0 74 68 61 74 20 6f 63 63 75 72 20 64 75 72 69 6e  that occur durin
104e0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20  g the rollback. 
104f0 20 20 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f       ** operatio
10500 6e 2e 20 53 6f 20 64 69 73 61 62 6c 65 20 49 4f  n. So disable IO
10510 20 65 72 72 6f 72 20 73 69 6d 75 6c 61 74 69 6f   error simulatio
10520 6e 20 73 6f 20 74 68 61 74 20 74 65 73 74 69 6e  n so that testin
10530 67 0a 20 20 20 20 20 20 2a 2a 20 77 6f 72 6b 73  g.      ** works
10540 20 6d 6f 72 65 20 65 61 73 69 6c 79 2e 0a 20 20   more easily..  
10550 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e      */.#if defin
10560 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20  ed(SQLITE_TEST) 
10570 26 26 20 28 64 65 66 69 6e 65 64 28 4f 53 5f 55  && (defined(OS_U
10580 4e 49 58 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  NIX) || defined(
10590 4f 53 5f 57 49 4e 29 29 0a 20 20 20 20 20 20 65  OS_WIN)).      e
105a0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
105b0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
105c0 6e 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 6f  ng;.      int io
105d0 65 72 72 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65  err_cnt = sqlite
105e0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
105f0 6e 67 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ng;.      sqlite
10600 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
10610 6e 67 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a  ng = -1;.#endif.
10620 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
10630 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
10640 65 72 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  er);.#if defined
10650 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
10660 20 28 64 65 66 69 6e 65 64 28 4f 53 5f 55 4e 49   (defined(OS_UNI
10670 58 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 53  X) || defined(OS
10680 5f 57 49 4e 29 29 0a 20 20 20 20 20 20 73 71 6c  _WIN)).      sql
10690 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
106a0 6e 64 69 6e 67 20 3d 20 69 6f 65 72 72 5f 63 6e  nding = ioerr_cn
106b0 74 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t;.#endif.      
106c0 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
106d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
106e0 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
106f0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
10700 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
10710 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  t( pPager->errMa
10720 73 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  sk || pPager->jo
10730 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
10740 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10750 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41 47 45   }.    case PAGE
10760 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20 20 20  R_SHARED: {.    
10770 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
10780 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
10790 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
107a0 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
107b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
107c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
107d0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
107e0 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
107f0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
10800 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70 50 67   }.  }.  for(pPg
10810 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
10820 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a  Pg; pPg=pNext){.
10830 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
10840 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
10850 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
10860 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
10870 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
10880 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
10890 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
108a0 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
108b0 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
108c0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
108d0 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
108e0 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
108f0 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78 74 20  endif.    pNext 
10900 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
10910 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
10920 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52 41 43  pPg);.  }.  TRAC
10930 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c  E2("CLOSE %d\n",
10940 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
10950 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
10960 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20  ger->errMask || 
10970 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  (pPager->journal
10980 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50 61 67 65  Open==0 && pPage
10990 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20  r->stmtOpen==0) 
109a0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
109b0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
109c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
109d0 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
109e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
109f0 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  ee(pPager->aInJo
10a00 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50  urnal);.  if( pP
10a10 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
10a20 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
10a30 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
10a40 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  fd);.  }.  sqlit
10a50 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
10a60 72 2d 3e 66 64 29 3b 0a 20 20 2f 2a 20 54 65 6d  r->fd);.  /* Tem
10a70 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
10a80 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
10a90 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
10aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
10ab0 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
10ac0 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
10ad0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
10ae0 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
10af0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
10b00 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
10b10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
10b20 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
10b30 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
10b40 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
10b50 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
10b60 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
10b70 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ber(void *pData)
10b80 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44  {.  PgHdr *p = D
10b90 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
10ba0 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
10bb0 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
10bc0 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
10bd0 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
10be0 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
10bf0 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
10c00 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
10c10 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
10c20 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
10c30 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
10c40 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
10c50 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
10c60 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
10c70 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
10c80 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
10c90 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
10ca0 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
10cb0 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
10cc0 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
10cd0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
10ce0 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
10cf0 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
10d00 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
10d10 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
10d20 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
10d30 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
10d40 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
10d50 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
10d60 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
10d70 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
10d80 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
10d90 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
10da0 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
10db0 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
10dc0 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
10dd0 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
10de0 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
10df0 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
10e00 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
10e10 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
10e20 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
10e30 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
10e40 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
10e50 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
10e60 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
10e70 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
10e80 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
10e90 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
10ea0 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
10eb0 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
10ec0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
10ed0 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
10ee0 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
10ef0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
10f00 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
10f10 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
10f20 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
10f30 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
10f40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10f50 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
10f60 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
10f70 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
10f80 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
10f90 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
10fa0 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
10fb0 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
10fc0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
10fd0 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
10fe0 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
10ff0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
11000 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
11010 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
11020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11030 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
11040 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
11050 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
11060 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
11070 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
11080 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
11090 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
110a0 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
110b0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
110c0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
110d0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
110e0 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
110f0 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
11100 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
11110 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
11120 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69  te3pager_ref(voi
11130 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
11140 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
11150 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
11160 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
11170 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11180 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
11190 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
111a0 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
111b0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
111c0 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
111d0 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
111e0 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
111f0 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
11200 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
11210 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
11220 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
11230 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
11240 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
11250 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
11260 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
11270 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
11280 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
11290 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
112a0 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
112b0 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
112c0 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
112d0 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
112e0 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
112f0 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
11300 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
11310 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
11320 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
11330 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
11340 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
11350 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
11360 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
11370 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
11380 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
11390 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
113a0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
113b0 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
113c0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
113d0 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
113e0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
113f0 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
11400 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
11410 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
11420 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
11430 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
11440 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
11450 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
11460 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
11470 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
11480 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
11490 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
114a0 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
114b0 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
114c0 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
114d0 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
114e0 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
114f0 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
11500 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
11510 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
11520 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
11530 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
11540 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
11550 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
11560 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
11570 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
11580 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
11590 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
115a0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
115b0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
115c0 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
115d0 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
115e0 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
115f0 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
11600 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
11610 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
11620 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
11630 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
11640 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
11650 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
11660 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
11670 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
11680 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
11690 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
116a0 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
116b0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
116c0 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
116d0 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
116e0 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
116f0 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
11700 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
11710 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
11720 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
11730 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
11740 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
11750 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
11760 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
11770 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
11780 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
11790 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
117a0 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
117b0 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
117c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
117d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
117e0 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
117f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11800 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
11810 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
11820 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
11830 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
11840 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
11850 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11860 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
11870 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
11880 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
11890 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
118a0 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
118b0 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
118c0 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
118d0 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
118e0 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
118f0 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
11900 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
11910 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
11920 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
11930 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
11940 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
11950 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
11960 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
11970 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
11980 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
11990 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
119a0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
119b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
119c0 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
119d0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
119e0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
119f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
11a00 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
11a10 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
11a20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11a30 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
11a40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11a50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
11a60 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
11a70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11a80 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
11a90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
11aa0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
11ab0 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20  lMagic));.      
11ac0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
11ad0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 72 63  n rc;.        rc
11ae0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
11af0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
11b00 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20 20  ger->nRec);.    
11b10 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
11b20 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  urn rc;..       
11b30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
11b40 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
11b50 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11b60 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  lOff);.        i
11b70 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
11b80 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
11b90 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
11ba0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
11bb0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
11bc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
11bd0 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
11be0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
11bf0 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 20 20  >fullSync);.    
11c00 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
11c10 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
11c20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
11c30 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
11c40 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
11c50 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
11c60 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
11c70 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
11c80 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
11c90 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
11ca0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
11cb0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
11cc0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
11cd0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
11ce0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
11cf0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
11d00 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
11d10 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
11d20 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
11d30 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
11d40 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
11d50 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
11d60 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
11d70 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
11d80 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
11d90 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
11da0 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
11db0 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
11dc0 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
11dd0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
11de0 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
11df0 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
11e00 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
11e10 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
11e20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
11e30 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
11e40 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
11e50 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
11e60 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
11e70 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
11e80 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
11e90 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
11ea0 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
11eb0 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
11ec0 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
11ed0 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
11ee0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11ef0 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
11f00 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
11f10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
11f20 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
11f30 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
11f40 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
11f50 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
11f60 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
11f70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11f80 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
11f90 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
11fa0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
11fb0 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
11fc0 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
11fd0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
11fe0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
11ff0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
12000 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
12010 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
12020 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
12030 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
12040 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
12050 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
12060 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
12070 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
12080 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
12090 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
120a0 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
120b0 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
120c0 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
120d0 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
120e0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
120f0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
12100 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
12110 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
12120 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
12130 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
12140 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
12150 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
12160 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
12170 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
12180 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
12190 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
121a0 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
121b0 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
121c0 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
121d0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
121e0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
121f0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
12200 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
12210 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
12220 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
12230 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
12240 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
12250 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
12260 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
12270 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
12280 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
12290 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
122a0 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
122b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
122c0 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
122d0 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
122e0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
122f0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
12300 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
12310 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
12320 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
12330 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
12340 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
12350 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
12360 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
12370 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
12380 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
12390 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
123a0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  rc = sqlite3OsSe
123b0 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ek(&pPager->fd, 
123c0 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
123d0 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
123e0 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
123f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
12400 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
12410 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
12420 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
12430 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
12440 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
12450 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
12460 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
12470 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
12480 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
12490 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
124a0 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
124b0 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
124c0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
124d0 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
124e0 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
124f0 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
12500 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
12510 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
12520 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
12530 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 28   ){.      CODEC(
12540 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
12550 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
12560 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20  ist->pgno, 6);. 
12570 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4f       TRACE3("STO
12580 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
12590 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
125a0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
125b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
125c0 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
125d0 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f  er->fd, PGHDR_TO
125e0 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 50  _DATA(pList), pP
125f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
12600 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
12610 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
12620 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74  TA(pList), pList
12630 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20  ->pgno, 0);.    
12640 20 20 54 45 53 54 5f 49 4e 43 52 28 70 50 61 67    TEST_INCR(pPag
12650 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
12660 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
12670 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
12680 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52    TRACE3("NOSTOR
12690 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
126a0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
126b0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
126c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
126d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
126e0 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
126f0 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
12700 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
12710 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
12720 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
12730 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
12740 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
12750 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
12760 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
12770 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
12780 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
12790 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
127a0 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
127b0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
127c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
127d0 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
127e0 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
127f0 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
12800 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
12810 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
12820 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
12830 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
12840 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
12850 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
12860 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c  *p, *pList;.  pL
12870 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ist = 0;.  for(p
12880 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
12890 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
128a0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72  {.    if( p->dir
128b0 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ty ){.      p->p
128c0 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20  Dirty = pList;. 
128d0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a       pList = p;.
128e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
128f0 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
12900 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
12910 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
12920 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
12930 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
12940 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
12950 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
12960 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
12970 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
12980 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
12990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
129a0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
129b0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
129c0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
129d0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
129e0 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
129f0 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
12a00 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
12a10 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
12a20 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
12a30 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
12a40 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
12a50 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
12a60 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
12a70 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
12a80 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
12a90 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
12aa0 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
12ab0 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nal) ) return 0;
12ac0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
12ad0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
12ae0 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20 29  k(&pPager->fd) )
12af0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12b00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
12b10 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
12b20 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12b30 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
12b40 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
12b50 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
12b60 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
12b70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
12b80 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
12b90 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
12ba0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
12bb0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
12bc0 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
12bd0 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
12be0 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
12bf0 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
12c00 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
12c10 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
12c20 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
12c30 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
12c40 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
12c50 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
12c60 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
12c70 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
12c80 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
12c90 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
12ca0 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
12cb0 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
12cc0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
12cd0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
12ce0 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
12cf0 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
12d00 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
12d10 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
12d20 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
12d30 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
12d40 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
12d50 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
12d60 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
12d70 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
12d80 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
12d90 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
12da0 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
12db0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
12dc0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
12dd0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
12de0 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
12df0 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
12e00 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
12e10 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
12e20 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
12e30 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
12e40 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
12e50 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
12e60 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
12e70 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
12e80 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
12e90 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
12ea0 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
12eb0 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
12ec0 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
12ed0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
12ee0 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
12ef0 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
12f00 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
12f10 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
12f20 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
12f30 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
12f40 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
12f50 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
12f60 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
12f70 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
12f80 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
12f90 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
12fa0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
12fb0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
12fc0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
12fd0 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72  3pager_get(Pager
12fe0 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
12ff0 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61  gno, void **ppPa
13000 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
13010 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
13020 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
13030 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
13040 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
13050 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
13060 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
13070 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
13080 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
13090 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
130a0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
130b0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
130c0 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47  ==0 || pgno==PAG
130d0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
130e0 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
130f0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
13100 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
13110 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
13120 65 20 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72  e not hit any cr
13130 69 74 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20  itical errors.. 
13140 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70   */ .  assert( p
13150 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70  Pager!=0 );.  *p
13160 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
13170 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
13180 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
13190 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
131a0 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
131b0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
131c0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
131d0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
131e0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
131f0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
13200 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
13210 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
13220 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
13230 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  f==0 && !MEMDB )
13240 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
13250 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b  r->noReadlock ){
13260 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
13270 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
13280 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f  Pager, SHARED_LO
13290 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
132a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
132b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
132c0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
132d0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f  ..    /* If a jo
132e0 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74  urnal file exist
132f0 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73 20  s, and there is 
13300 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  no RESERVED lock
13310 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64   on the.    ** d
13320 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
13330 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
13340 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
13350 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
13360 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
13370 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50  hasHotJournal(pP
13380 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
13390 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  int rc;..       
133a0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
133b0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
133c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
133d0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
133e0 69 73 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70  is.       ** imp
133f0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
13400 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
13410 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
13420 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
13430 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
13440 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
13450 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
13460 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
13470 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
13480 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
13490 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
134a0 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
134b0 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
134c0 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
134d0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
134e0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
134f0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
13500 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a  ng it .       **
13510 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a   back..       **
13520 20 0a 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61   .       ** Beca
13530 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
13540 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
13550 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
13560 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ted, the.       
13570 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73  ** second proces
13580 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68  s will get to th
13590 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
135a0 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
135b0 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69  .       ** obtai
135c0 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55  n it's own EXCLU
135d0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
135e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
135f0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13600 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
13610 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
13620 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
13630 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
13640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13650 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
13660 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
13670 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
13680 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
13690 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
136a0 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
136b0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
136c0 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
136d0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
136e0 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20  XCLUSIVE;..     
136f0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
13700 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
13710 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
13720 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
13730 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
13740 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
13750 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
13760 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   .       **.    
13770 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
13780 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
13790 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
137a0 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
137b0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
137c0 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
137d0 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
137e0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
137f0 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a  e holds.       *
13800 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
13810 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
13820 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
13830 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
13840 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
13850 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
13860 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
13870 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  time..       */.
13880 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13890 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
138a0 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
138b0 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
138c0 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
138d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
138e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
138f0 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
13900 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
13910 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
13920 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
13930 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72  LOCK;.         r
13940 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
13950 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  Y;.       }.    
13960 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13970 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
13980 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13990 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
139a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
139b0 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
139c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
139d0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
139e0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
139f0 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20  alHdr = 0;..    
13a00 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
13a10 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
13a20 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
13a30 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
13a40 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61         ** lock a
13a50 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
13a60 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
13a70 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
13a80 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
13a90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
13aa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13ab0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  OK ){.         r
13ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
13ad0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
13ae0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
13af0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
13b00 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a   page in cache *
13b10 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
13b20 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
13b30 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
13b40 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
13b50 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
13b60 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
13b70 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
13b80 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
13b90 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  }.  }.  if( pPg=
13ba0 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
13bb0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
13bc0 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
13bd0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
13be0 20 69 6e 74 20 68 3b 0a 20 20 20 20 54 45 53 54   int h;.    TEST
13bf0 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 4d  _INCR(pPager->nM
13c00 69 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70 50  iss);.    if( pP
13c10 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67  ager->nPage<pPag
13c20 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50  er->mxPage || pP
13c30 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20  ager->pFirst==0 
13c40 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  || MEMDB ){.    
13c50 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65    /* Create a ne
13c60 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  w page */.      
13c70 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  pPg = sqliteMall
13c80 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
13c90 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  Pg) + pPager->pa
13ca0 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20  geSize.         
13cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cc0 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33       + sizeof(u3
13cd0 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
13ce0 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
13d10 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
13d20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
13d30 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
13d40 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
13d50 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20  GER_ERR_MEM;.   
13d60 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13d70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
13d80 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  }.      memset(p
13d90 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  Pg, 0, sizeof(*p
13da0 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Pg));.      if( 
13db0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
13dc0 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
13dd0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
13de0 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67  r), 0, sizeof(Pg
13df0 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20  History));.     
13e00 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50   }.      pPg->pP
13e10 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20  ager = pPager;. 
13e20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41       pPg->pNextA
13e30 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c  ll = pPager->pAl
13e40 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  l;.      pPager-
13e50 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
13e60 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65     pPager->nPage
13e70 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ++;.      if( pP
13e80 61 67 65 72 2d 3e 6e 50 61 67 65 3e 70 50 61 67  ager->nPage>pPag
13e90 65 72 2d 3e 6e 4d 61 78 50 61 67 65 20 29 7b 0a  er->nMaxPage ){.
13ea0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
13eb0 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
13ec0 3d 3d 28 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  ==(pPager->nPage
13ed0 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  -1) );.        p
13ee0 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65 2b  Pager->nMaxPage+
13ef0 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  +;.      }.    }
13f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 46  else{.      /* F
13f10 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
13f20 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
13f30 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
13f40 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20 20  t does not.     
13f50 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74   ** require us t
13f60 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20  o do an fsync() 
13f70 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  on the journal..
13f80 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
13f90 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  Pg = pPager->pFi
13fa0 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20 20  rstSynced;..    
13fb0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
13fc0 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
13fd0 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
13fe0 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
13ff0 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68  ).      ** on th
14000 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
14010 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
14020 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
14030 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a 20  s is a.      ** 
14040 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74  very slow operat
14050 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20  ion, so we work 
14060 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74  hard to avoid it
14070 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73  .  But sometimes
14080 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
14090 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20  't be helped..  
140a0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
140b0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
140c0 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63     int rc = sync
140d0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
140e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
140f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
14100 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
14110 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
14120 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14130 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
14140 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14150 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
14160 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  Sync ){.        
14170 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d    /* If in full-
14180 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74 65  sync mode, write
14190 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 68   a new journal h
141a0 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a 09  eader into the..
141b0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
141c0 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20  e. This is done 
141d0 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f  to avoid ever mo
141e0 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61  difying a journa
141f0 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72 20 74  l..  ** header t
14200 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20  hat is involved 
14210 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
14220 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61  of pages that ha
14230 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64 79  ve..  ** already
14240 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
14250 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69   the database (i
14260 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65  n case the heade
14270 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61 73 68  r is..  ** trash
14280 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65 63  ed when the nRec
14290 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
142a0 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  d)..          */
142b0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
142c0 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
142d0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
142e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
142f0 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20 20  f > 0 );.       
14300 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
14310 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
14320 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
14330 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
14340 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
14350 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
14360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
14370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
14380 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  RR;.          }.
14390 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
143a0 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e    pPg = pPager->
143b0 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d 0a  pFirst;.      }.
143c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
143d0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20  g->nRef==0 );.. 
143e0 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68       /* Write th
143f0 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64 61  e page to the da
14400 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
14410 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20 20  t is dirty..    
14420 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
14430 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
14440 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
14450 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
14460 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 44  .        pPg->pD
14470 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
14480 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
14490 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67  te_pagelist( pPg
144a0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
144b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
144c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
144d0 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
144e0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
144f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14500 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
14510 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
14520 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69   assert( pPg->di
14530 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  rty==0 );..     
14540 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
14550 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
14560 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
14570 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
14580 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74 20  en.      ** set 
14590 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
145a0 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
145b0 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
145c0 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  he.      ** sqli
145d0 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  te_dont_rollback
145e0 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
145f0 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
14600 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
14610 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69 73  ..      ** It is
14620 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f   necessary to do
14630 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68   this because th
14640 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c  e page marked al
14650 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 20  waysRollback.   
14660 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20 72     ** might be r
14670 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61 74  eloaded at a lat
14680 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20 74  er time but at t
14690 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f 6e  hat point we won
146a0 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20 20  't remember.    
146b0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
146c0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
146d0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
146e0 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
146f0 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  es must.      **
14700 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
14710 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
14720 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
14730 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
14740 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
14750 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  lback ){.       
14760 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52   pPager->alwaysR
14770 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 20  ollback = 1;.   
14780 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 55     }..      /* U
14790 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61  nlink the old pa
147a0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
147b0 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68 61   list and the ha
147c0 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  sh table.      *
147d0 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  /.      unlinkPa
147e0 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 54  ge(pPg);.      T
147f0 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
14800 3e 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 7d 0a 20  >nOvfl);.    }. 
14810 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70     pPg->pgno = p
14820 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61  gno;.    if( pPa
14830 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
14840 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50  && (int)pgno<=pP
14850 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
14860 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
14870 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61  3CheckMemory(pPa
14880 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->aInJournal,
14890 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20   pgno/8);.      
148a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
148b0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
148c0 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
148d0 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
148e0 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
148f0 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
14900 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
14910 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
14920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14930 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
14940 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
14950 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
14960 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
14970 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28  er->aInStmt && (
14980 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72  int)pgno<=pPager
14990 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20  ->stmtSize.     
149a0 20 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67          && (pPag
149b0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f  er->aInStmt[pgno
149c0 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
149d0 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  7)))!=0 ){.     
149e0 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d   page_add_to_stm
149f0 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  t_list(pPg);.   
14a00 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61   }else{.      pa
14a10 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73  ge_remove_from_s
14a20 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
14a30 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69     }.    pPg->di
14a40 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  rty = 0;.    pPg
14a50 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
14a60 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20  REFINFO(pPg);.  
14a70 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
14a80 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f  ;.    h = pager_
14a90 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20  hash(pgno);.    
14aa0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
14ab0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
14ac0 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  ];.    pPager->a
14ad0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
14ae0 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78     if( pPg->pNex
14af0 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61  tHash ){.      a
14b00 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
14b10 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
14b20 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67  ==0 );.      pPg
14b30 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
14b40 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
14b50 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
14b60 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
14b70 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
14b80 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
14b90 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
14ba0 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
14bb0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
14bc0 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
14bd0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70  {.      sqlite3p
14be0 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
14bf0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
14c00 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14c10 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
14c20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
14c30 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
14c40 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
14c50 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3c  gecount(pPager)<
14c60 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20 20  (int)pgno ){.   
14c70 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
14c80 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
14c90 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
14ca0 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e);.    }else{. 
14cb0 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
14cc0 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42     assert( MEMDB
14cd0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  ==0 );.      rc 
14ce0 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
14cf0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67  &pPager->fd, (pg
14d00 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
14d10 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14d20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14d30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
14d50 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ead(&pPager->fd,
14d60 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
14d70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
14d80 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
14d90 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46 45        TRACE3("FE
14da0 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e  TCH %d page %d\n
14db0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
14dc0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  r), pPg->pgno);.
14dd0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
14de0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
14df0 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e  A(pPg), pPg->pgn
14e00 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66 28  o, 3);.      if(
14e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14e20 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 66 69  {.        i64 fi
14e30 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  leSize;.        
14e40 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  if( sqlite3OsFil
14e50 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66  eSize(&pPager->f
14e60 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53 51  d,&fileSize)!=SQ
14e70 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20  LITE_OK.        
14e80 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53 69         || fileSi
14e90 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d  ze>=pgno*pPager-
14ea0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
14eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
14ec0 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52 5f  ger_unref(PGHDR_
14ed0 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a 20  TO_DATA(pPg));. 
14ee0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14ef0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rc;.        }els
14f00 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
14f10 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
14f20 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
14f30 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
14f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14f50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 54 45 53  lse{.        TES
14f60 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  T_INCR(pPager->n
14f70 52 65 61 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Read);.      }. 
14f80 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
14f90 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20  TE_CHECK_PAGES. 
14fa0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
14fb0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
14fc0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
14fd0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
14fe0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
14ff0 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67 65  e is in the page
15000 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 54   cache. */.    T
15010 45 53 54 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  EST_INCR(pPager-
15020 3e 6e 48 69 74 29 3b 0a 20 20 20 20 70 61 67 65  >nHit);.    page
15030 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
15040 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
15050 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
15060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15070 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
15080 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
15090 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
150a0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
150b0 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
150c0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
150d0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
150e0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
150f0 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
15100 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
15110 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
15120 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
15130 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  e3pager_get().  
15140 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
15150 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
15160 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
15170 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  e3pager_get() is
15180 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
15190 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
151a0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
151b0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
151c0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
151d0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
151e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
151f0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
15200 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
15210 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
15220 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
15230 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
15240 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
15250 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
15260 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
15270 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
15280 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
15290 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
152a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
152b0 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
152c0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
152d0 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
152e0 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
152f0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
15300 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
15310 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
15320 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
15330 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
15340 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
15350 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
15360 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
15370 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
15380 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
15390 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
153a0 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
153b0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
153c0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
153d0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
153e0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
153f0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
15400 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
15410 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
15420 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
15430 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15440 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
15450 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
15460 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f  e3pager_unref(vo
15470 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
15480 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
15490 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
154a0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
154b0 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
154c0 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  .  pPg = DATA_TO
154d0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
154e0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
154f0 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
15500 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
15510 28 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  (pPg);..  CHECK_
15520 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
15530 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   When the number
15540 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
15550 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30  o a page reach 0
15560 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20  , call the.  ** 
15570 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61  destructor and a
15580 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
15590 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a  he freelist..  *
155a0 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  /.  if( pPg->nRe
155b0 66 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65  f==0 ){.    Page
155c0 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70  r *pPager;.    p
155d0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
155e0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  ger;.    pPg->pN
155f0 65 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20  extFree = 0;.   
15600 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
15610 3d 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b  = pPager->pLast;
15620 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
15630 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  st = pPg;.    if
15640 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
15650 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
15660 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
15670 72 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ree = pPg;.    }
15680 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67  else{.      pPag
15690 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
156a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
156b0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
156c0 20 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72   && pPager->pFir
156d0 73 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20  stSynced==0 ){. 
156e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
156f0 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
15700 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15710 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
15720 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  or ){.      pPag
15730 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
15740 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
15750 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
15760 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
15770 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
15780 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
15790 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
157a0 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
157b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
157c0 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
157d0 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
157e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
157f0 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
15800 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
15810 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20   && !MEMDB ){.  
15820 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15830 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
15840 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15850 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15860 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c  Create a journal
15870 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72   file for pPager
15880 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20  .  There should 
15890 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53  already be a RES
158a0 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c  ERVED.** or EXCL
158b0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
158c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
158d0 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
158e0 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  e is called..**.
158f0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
15900 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
15910 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  g.  Return an er
15920 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c  ror code and rel
15930 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74  ease the.** writ
15940 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69  e lock if anythi
15950 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
15960 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
15970 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
15980 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
15990 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
159a0 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
159b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
159c0 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
159d0 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
159e0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
159f0 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61  alOpen==0 );.  a
15a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
15a10 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
15a20 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
15a30 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
15a40 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70    sqlite3pager_p
15a50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
15a60 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
15a70 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 4d  ournal = sqliteM
15a80 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64  alloc( pPager->d
15a90 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20  bSize/8 + 1 );. 
15aa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
15ab0 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20  Journal==0 ){.  
15ac0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15ad0 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  MEM;.    goto fa
15ae0 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
15af0 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  rnal;.  }.  rc =
15b00 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
15b10 63 6c 75 73 69 76 65 28 70 50 61 67 65 72 2d 3e  clusive(pPager->
15b20 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
15b30 72 2d 3e 6a 66 64 2c 70 50 61 67 65 72 2d 3e 74  r->jfd,pPager->t
15b40 65 6d 70 46 69 6c 65 29 3b 0a 20 20 70 50 61 67  empFile);.  pPag
15b50 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
15b60 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65   0;.  pPager->se
15b70 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
15b80 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
15b90 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21  r = 0;.  if( rc!
15ba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15bb0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
15bc0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
15bd0 20 7d 0a 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e   }.  SET_FULLSYN
15be0 43 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  C(pPager->jfd, p
15bf0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29  Pager->fullSync)
15c00 3b 0a 20 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43  ;.  SET_FULLSYNC
15c10 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
15c20 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a  ger->fullSync);.
15c30 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44    sqlite3OsOpenD
15c40 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72 2d  irectory(pPager-
15c50 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20 26 70 50  >zDirectory, &pP
15c60 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50  ager->jfd);.  pP
15c70 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
15c80 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
15c90 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
15ca0 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
15cb0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
15cc0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
15cd0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
15ce0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
15cf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
15d00 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72  Mask!=0 ){.    r
15d10 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64  c = pager_errcod
15d20 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 67  e(pPager);.    g
15d30 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
15d40 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
15d50 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
15d60 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
15d70 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77  bSize;..  rc = w
15d80 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
15d90 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20 70  Pager);..  if( p
15da0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
15db0 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  pen && rc==SQLIT
15dc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
15dd0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
15de0 6d 74 5f 62 65 67 69 6e 28 70 50 61 67 65 72 29  mt_begin(pPager)
15df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
15e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e10 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
15e20 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
15e30 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
15e40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15e50 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
15e60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
15e70 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
15e80 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
15e90 3a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  :.  sqliteFree(p
15ea0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
15eb0 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49  l);.  pPager->aI
15ec0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
15ed0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
15ee0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
15ef0 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
15f00 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
15f10 4e 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20  NLOCK;.  return 
15f20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  rc;.}../*.** Acq
15f30 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63  uire a write-loc
15f40 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
15f50 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20  e.  The lock is 
15f60 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20  removed when.** 
15f70 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66  the any of the f
15f80 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a  ollowing happen:
15f90 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  .**.**   *  sqli
15fa0 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
15fb0 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
15fc0 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
15fd0 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 69 73 20  r_rollback() is 
15fe0 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
15ff0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
16000 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
16010 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70  **   *  sqlite3p
16020 61 67 65 72 5f 75 6e 72 65 66 28 29 20 69 73 20  ager_unref() is 
16030 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65 76 65  called to on eve
16040 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70  ry outstanding p
16050 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
16060 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 20 74  irst parameter t
16070 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
16080 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
16090 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f 66 20  ny open page of 
160a0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
160b0 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67 20 63  file.  Nothing c
160c0 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74 68 65  hanges about the
160d0 20 70 61 67 65 20 2d 20 69 74 20 69 73 20 75 73   page - it is us
160e0 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a 2a 20  ed merely to.** 
160f0 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e 74 65  acquire a pointe
16100 72 20 74 6f 20 74 68 65 20 50 61 67 65 72 20 73  r to the Pager s
16110 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 73 20  tructure and as 
16120 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65 72 65  proof that there
16130 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79 20 61   is.** already a
16140 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
16150 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
16160 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70 61 72  * The second par
16170 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74 65 73  ameter indicates
16180 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63 65 20   how much space 
16190 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65 73 65  in bytes to rese
161a0 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d 61 73  rve for a.** mas
161b0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
161c0 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73 74 61  -name at the sta
161d0 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  rt of the journa
161e0 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63 72 65  l when it is cre
161f0 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f  ated..**.** A jo
16200 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70  urnal file is op
16210 65 6e 65 64 20 69 66 20 74 68 69 73 20 69 73 20  ened if this is 
16220 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72 79 20  not a temporary 
16230 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d 70 6f  file.  For tempo
16240 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c 20 74  rary.** files, t
16250 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20 74 68  he opening of th
16260 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
16270 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69 6c  s deferred until
16280 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a 2a 20   there is an.** 
16290 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 77  actual need to w
162a0 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
162b0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  nal..**.** If th
162c0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61 6c  e database is al
162d0 72 65 61 64 79 20 72 65 73 65 72 76 65 64 20 66  ready reserved f
162e0 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68 69 73  or writing, this
162f0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
16300 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 78  -op..**.** If ex
16310 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 67 6f  Flag is true, go
16320 20 61 68 65 61 64 20 61 6e 64 20 67 65 74 20 61   ahead and get a
16330 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
16340 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
16350 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 73 74  immediately inst
16360 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67 20 75  ead of waiting u
16370 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f 20 66  ntil we try to f
16380 6c 75 73 68 20 74 68 65 20 63 61 63 68 65 2e 20  lush the cache. 
16390 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67 20 69   The.** exFlag i
163a0 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61 20 74  s ignored if a t
163b0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
163c0 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2f  ready active..*/
163d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
163e0 72 5f 62 65 67 69 6e 28 76 6f 69 64 20 2a 70 44  r_begin(void *pD
163f0 61 74 61 2c 20 69 6e 74 20 65 78 46 6c 61 67 29  ata, int exFlag)
16400 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
16410 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
16420 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
16430 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
16440 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
16450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
16460 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
16470 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
16480 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
16490 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
164a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
164b0 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
164c0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
164d0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
164e0 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  l==0 );.    if( 
164f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70  MEMDB ){.      p
16500 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
16510 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
16520 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
16530 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
16540 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 7d  r->dbSize;.    }
16550 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
16560 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
16570 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45  pPager->fd, RESE
16580 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  RVED_LOCK);.    
16590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
165a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
165b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
165c0 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a 20  AGER_RESERVED;. 
165d0 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c 61         if( exFla
165e0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  g ){.          r
165f0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
16600 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
16610 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
16620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16630 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  }.      if( rc!=
16640 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16650 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
16670 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
16680 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 52 41 43   = 0;.      TRAC
16690 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f 4e 20  E2("TRANSACTION 
166a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
166b0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 69  Pager));.      i
166c0 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
166d0 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67 65 72  urnal && !pPager
166e0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
166f0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
16700 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
16710 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
16720 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
16730 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
16740 61 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20  ark a data page 
16750 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54  as writeable.  T
16760 68 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74  he page is writt
16770 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
16780 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73  nal .** if it is
16790 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61   not there alrea
167a0 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  dy.  This routin
167b0 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
167c0 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a   before making.*
167d0 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70  * changes to a p
167e0 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  age..**.** The f
167f0 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72  irst time this r
16800 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16810 2c 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61  , the pager crea
16820 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75  tes a new.** jou
16830 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65  rnal and acquire
16840 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
16850 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
16860 65 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52  e.  If the RESER
16870 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c  VED.** lock coul
16880 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65  d not be acquire
16890 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
168a0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
168b0 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c  USY.  The.** cal
168c0 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73  ling routine mus
168d0 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74  t check for that
168e0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e   return value an
168f0 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74  d be careful not
16900 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e   to.** change an
16910 79 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69  y page data unti
16920 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
16930 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
16940 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a  ..**.** If the j
16950 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c  ournal file coul
16960 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  d not be written
16970 20 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73   because the dis
16980 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68  k is full,.** th
16990 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
169a0 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46  returns SQLITE_F
169b0 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20  ULL and does an 
169c0 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61  immediate rollba
169d0 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65  ck..** All subse
169e0 71 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65  quent write atte
169f0 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  mpts also return
16a00 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74   SQLITE_FULL unt
16a10 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61  il there.** is a
16a20 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
16a30 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 6f  pager_commit() o
16a40 72 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  r sqlite3pager_r
16a50 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
16a60 72 65 73 65 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  reset..*/.int sq
16a70 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
16a80 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
16a90 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
16aa0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
16ab0 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
16ac0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
16ad0 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  r;.  int rc = SQ
16ae0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43  LITE_OK;..  /* C
16af0 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a  heck for errors.
16b00 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
16b10 72 2d 3e 65 72 72 4d 61 73 6b 20 29 7b 20 0a 20  r->errMask ){ . 
16b20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
16b30 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
16b40 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
16b50 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  r->readOnly ){. 
16b60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16b70 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73  _PERM;.  }..  as
16b80 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73  sert( !pPager->s
16b90 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43  etMaster );..  C
16ba0 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a  HECK_PAGE(pPg);.
16bb0 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70  .  /* Mark the p
16bc0 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49  age as dirty.  I
16bd0 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61  f the page has a
16be0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
16bf0 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ten.  ** to the 
16c00 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20  journal then we 
16c10 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74  can return right
16c20 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70 50   away..  */.  pP
16c30 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  g->dirty = 1;.  
16c40 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  if( pPg->inJourn
16c50 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53 74  al && (pPg->inSt
16c60 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  mt || pPager->st
16c70 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
16c80 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
16c90 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c  Cache = 1;.  }el
16ca0 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77  se{..    /* If w
16cb0 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c 20  e get this far, 
16cc0 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  it means that th
16cd0 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f 20  e page needs to 
16ce0 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  be.    ** writte
16cf0 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63  n to the transac
16d00 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20  tion journal or 
16d10 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a  the ckeckpoint j
16d20 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72  ournal.    ** or
16d30 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20   both..    **.  
16d40 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63 6b    ** First check
16d50 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68 65   to see that 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 65 78 69 73 74 73 20 61 6e 64 0a  rnal exists and.
16d80 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69 74      ** create it
16d90 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   if it does not.
16da0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
16db0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
16dc0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
16dd0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
16de0 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 70  te3pager_begin(p
16df0 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69 66  Data, 0);.    if
16e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16e10 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16e20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
16e30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
16e40 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
16e50 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20 21  VED );.    if( !
16e60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16e70 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 75  pen && pPager->u
16e80 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
16e90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
16ea0 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
16eb0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
16ec0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
16ed0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
16ee0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16ef0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c  r->journalOpen |
16f00 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  | !pPager->useJo
16f10 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61  urnal );.    pPa
16f20 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
16f30 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
16f40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
16f50 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
16f60 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
16f70 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
16f80 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
16f90 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
16fa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
16fb0 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
16fc0 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
16fd0 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
16fe0 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
16ff0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
17000 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
17010 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
17020 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
17030 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20 4d  >useJournal || M
17040 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20 69  EMDB) ){.      i
17050 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
17060 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
17070 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
17080 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20 20     int szPg;.   
17090 20 20 20 20 20 75 33 32 20 73 61 76 65 64 3b 0a       u32 saved;.
170a0 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44          if( MEMD
170b0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  B ){.          P
170c0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
170d0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
170e0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
170f0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
17100 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
17110 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
17120 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
17130 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  o);.          as
17140 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f 72  sert( pHist->pOr
17150 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ig==0 );.       
17160 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20     pHist->pOrig 
17170 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
17180 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
17190 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
171a0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
171b0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
171c0 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70   memcpy(pHist->p
171d0 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44  Orig, PGHDR_TO_D
171e0 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
171f0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
17200 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
17210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
17220 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
17230 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f         /* We sho
17240 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20  uld never write 
17250 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
17260 69 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ile the page tha
17270 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  t.          ** c
17280 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
17290 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
172a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
172b0 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
172c0 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
172d0 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
172e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
172f0 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  ->pgno!=PAGER_MJ
17300 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
17310 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44 45 43  .          CODEC
17320 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
17330 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20  pPg->pgno, 7);. 
17340 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d           cksum =
17350 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
17360 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ger, pPg->pgno, 
17370 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  pData);.        
17380 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a    saved = *(u32*
17390 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  )PGHDR_TO_EXTRA(
173a0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
173b0 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
173c0 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20  its(cksum, pPg, 
173d0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
173e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  );.          szP
173f0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g = pPager->page
17400 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20  Size+8;.        
17410 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50    store32bits(pP
17420 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34  g->pgno, pPg, -4
17430 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
17440 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
17450 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
17460 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d  ((char*)pData)[-
17470 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20  4], szPg);.     
17480 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
17490 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b  rnalOff += szPg;
174a0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
174b0 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  4("JOURNAL %d pa
174c0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
174d0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
174e0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
174f0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
17500 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
17510 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f  c);.          CO
17520 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
17530 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29  a, pPg->pgno, 0)
17540 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33  ;.          *(u3
17550 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  2*)PGHDR_TO_EXTR
17560 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 20 3d  A(pPg, pPager) =
17570 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20   saved;.        
17580 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17590 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
175a0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
175b0 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
175c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
175d0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
175e0 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
175f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
17600 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
17610 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50    }.          pP
17620 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20  ager->nRec++;.  
17630 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17640 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
17650 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
17660 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
17670 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
17680 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
17690 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20  gno&7);.        
176a0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
176b0 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = !pPager->noSyn
176c0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  c;.          if(
176d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
176e0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
176f0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
17700 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
17710 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
17720 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  7);.            
17730 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
17740 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
17750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
17760 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
17770 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64         pPg->need
17780 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
17790 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26  journalStarted &
177a0 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  & !pPager->noSyn
177b0 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  c;.        TRACE
177c0 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  4("APPEND %d pag
177d0 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
177e0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
177f0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
17800 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
17810 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
17820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17830 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
17840 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
17850 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
17860 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17870 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
17880 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   1;.    }.  .   
17890 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
178a0 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
178b0 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
178c0 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
178d0 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
178e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
178f0 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
17900 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
17910 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
17920 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
17930 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
17940 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
17950 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
17960 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
17970 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
17980 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
17990 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
179a0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
179b0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
179c0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
179d0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
179e0 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
179f0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
17a00 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
17a10 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
17a20 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
17a30 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66  Size );.      if
17a40 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
17a50 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
17a60 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
17a70 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
17a80 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17a90 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d  ( pHist->pStmt==
17aa0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  0 );.        pHi
17ab0 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69  st->pStmt = sqli
17ac0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
17ad0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
17ae0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
17af0 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
17b00 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
17b10 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44  ist->pStmt, PGHD
17b20 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
17b30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
17b40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
17b50 20 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d       TRACE3("STM
17b60 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  T-JOURNAL %d pag
17b70 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
17b80 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
17b90 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  gno);.      }els
17ba0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  e{.        store
17bb0 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f  32bits(pPg->pgno
17bc0 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20  , pPg, -4);.    
17bd0 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
17be0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
17bf0 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
17c00 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
17c10 69 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66  ite(&pPager->stf
17c20 64 2c 28 28 63 68 61 72 2a 29 70 44 61 74 61 29  d,((char*)pData)
17c30 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  -4, pPager->page
17c40 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20  Size+4);.       
17c50 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f   TRACE3("STMT-JO
17c60 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
17c70 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
17c80 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
17c90 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28  ;.        CODEC(
17ca0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
17cb0 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  Pg->pgno, 0);.  
17cc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
17cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
17ce0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
17cf0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
17d00 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  r);.          pP
17d10 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
17d20 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b   PAGER_ERR_FULL;
17d30 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
17d40 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
17d50 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17d60 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20  stmtNRec++;.    
17d70 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
17d80 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29  er->aInStmt!=0 )
17d90 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
17da0 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
17db0 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
17dc0 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20  g->pgno&7);.    
17dd0 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61    }.      page_a
17de0 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
17df0 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
17e00 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
17e10 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61   database size a
17e20 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a  nd return..  */.
17e30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
17e40 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70  Size<(int)pPg->p
17e50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65  gno ){.    pPage
17e60 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d  r->dbSize = pPg-
17e70 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21  >pgno;.    if( !
17e80 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
17e90 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47  >dbSize==PENDING
17ea0 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
17eb0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
17ec0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b  pPager->dbSize++
17ed0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
17ee0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
17ef0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
17f00 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
17f10 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
17f20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
17f30 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
17f40 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29  te3pager_write()
17f50 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
17f60 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
17f70 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
17f80 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
17f90 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
17fa0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
17fb0 61 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65  ager_iswriteable
17fc0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
17fd0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
17fe0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
17ff0 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67  a);.  return pPg
18000 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23 69 66 6e  ->dirty;.}..#ifn
18010 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18020 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70  VACUUM./*.** Rep
18030 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
18040 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
18050 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
18060 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
18070 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
18080 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
18090 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65 28 50  ager_overwrite(P
180a0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
180b0 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
180c0 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70  Data){.  void *p
180d0 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Page;.  int rc;.
180e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70  .  rc = sqlite3p
180f0 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c  ager_get(pPager,
18100 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a   pgno, &pPage);.
18110 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18120 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
18130 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
18140 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 69  te(pPage);.    i
18150 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18160 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
18170 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c 20 70  (pPage, pData, p
18180 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
18190 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
181a0 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70  te3pager_unref(p
181b0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
181c0 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
181d0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
181e0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
181f0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
18200 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
18210 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
18220 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
18230 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
18240 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
18250 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
18260 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
18270 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
18280 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
18290 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
182a0 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
182b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
182c0 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
182d0 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
182e0 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
182f0 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
18300 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
18310 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
18320 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
18330 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
18340 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
18350 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
18360 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
18370 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
18380 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
18390 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
183a0 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
183b0 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
183c0 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
183d0 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
183e0 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
183f0 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
18400 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
18410 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
18420 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
18430 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
18440 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
18450 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
18460 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ls to sqlite3pag
18470 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
18480 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
18490 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
184a0 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
184b0 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
184c0 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
184d0 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
184e0 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
184f0 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
18500 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
18510 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
18520 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
18530 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
18540 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
18550 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
18560 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
18570 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
18580 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
18590 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
185a0 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
185b0 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
185c0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
185d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
185e0 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
185f0 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
18600 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
18610 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
18620 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
18630 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
18640 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
18650 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
18660 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
18670 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
18680 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
18690 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
186a0 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
186b0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
186c0 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
186d0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
186e0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
186f0 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74   if( MEMDB ) ret
18700 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  urn;..  pPg = pa
18710 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
18720 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  r, pgno);.  pPg-
18730 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
18740 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26  = 1;.  if( pPg &
18750 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  & pPg->dirty ){.
18760 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
18770 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
18780 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
18790 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
187a0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
187b0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
187c0 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
187d0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
187e0 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
187f0 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
18800 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
18810 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
18820 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
18830 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
18840 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
18850 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
18860 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
18870 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
18880 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
18890 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
188a0 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
188b0 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
188c0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
188d0 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
188e0 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
188f0 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
18900 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
18910 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
18920 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
18930 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
18940 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
18950 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
18960 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
18970 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
18980 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
18990 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
189a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
189b0 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33  se{.      TRACE3
189c0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
189d0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
189e0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
189f0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
18a00 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66  ->dirty = 0;.#if
18a10 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
18a20 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
18a30 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
18a40 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
18a50 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
18a60 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61   }.}../*.** A ca
18a70 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
18a80 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
18a90 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c  er that if a rol
18aa0 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a  lback occurs,.**
18ab0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
18ac0 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20  sary to restore 
18ad0 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20  the data on the 
18ae0 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69  given page.  Thi
18af0 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  s.** means that 
18b00 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
18b10 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72  ot have to recor
18b20 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  d the given page
18b30 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62   in the.** rollb
18b40 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a  ack journal..*/.
18b50 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
18b60 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  r_dont_rollback(
18b70 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
18b80 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
18b90 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
18ba0 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  );.  Pager *pPag
18bb0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
18bc0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
18bd0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45 58  >state!=PAGER_EX
18be0 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67 65  CLUSIVE || pPage
18bf0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
18c00 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
18c10 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c  ( pPg->alwaysRol
18c20 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d  lback || pPager-
18c30 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
18c40 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72  || MEMDB ) retur
18c50 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  n;.  if( !pPg->i
18c60 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
18c70 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
18c80 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
18c90 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
18ca0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
18cb0 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  al!=0 );.    pPa
18cc0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
18cd0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
18ce0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
18cf0 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  ;.    pPg->inJou
18d00 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69 66  rnal = 1;.    if
18d10 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
18d20 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Use ){.      pPa
18d30 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
18d40 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
18d50 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
18d60 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
18d70 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
18d80 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43 45  .    }.    TRACE
18d90 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43 4b  3("DONT_ROLLBACK
18da0 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e   page %d of %d\n
18db0 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41  ", pPg->pgno, PA
18dc0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
18dd0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
18de0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21  ->stmtInUse && !
18df0 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28  pPg->inStmt && (
18e00 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70  int)pPg->pgno<=p
18e10 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
18e20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18e30 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
18e40 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e   (int)pPg->pgno>
18e50 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
18e60 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ze );.    assert
18e70 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
18e80 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  t!=0 );.    pPag
18e90 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
18ea0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
18eb0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
18ec0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
18ed0 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
18ee0 7d 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  }.}...#ifndef SQ
18ef0 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
18f00 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61  DB./*.** Clear a
18f10 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b   PgHistory block
18f20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18f30 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48  clearHistory(PgH
18f40 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a  istory *pHist){.
18f50 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
18f60 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71  st->pOrig);.  sq
18f70 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e  liteFree(pHist->
18f80 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d  pStmt);.  pHist-
18f90 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70 48  >pOrig = 0;.  pH
18fa0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
18fb0 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
18fc0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29 0a  clearHistory(x).
18fd0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f  #endif../*.** Co
18fe0 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
18ff0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
19000 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
19010 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
19020 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
19030 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
19040 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
19050 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
19060 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
19070 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
19080 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
19090 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
190a0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
190b0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
190c0 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28  te3pager_commit(
190d0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
190e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
190f0 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70  r *pPg;..  if( p
19100 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d  Pager->errMask==
19110 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
19120 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
19130 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
19140 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
19150 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
19160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
19170 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d  LITE_FULL;.    }
19180 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19190 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
191a0 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
191b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
191c0 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
191d0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
191e0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
191f0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
19200 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
19210 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
19220 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22  ;.  }.  TRACE2("
19230 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41  COMMIT %d\n", PA
19240 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
19250 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
19260 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67     pPg = pager_g
19270 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
19280 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  es(pPager);.    
19290 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20  while( pPg ){.  
192a0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
192b0 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
192c0 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
192d0 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
192e0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
192f0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
19300 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
19310 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
19320 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
19330 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
19340 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
19350 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23  >pDirty;.    }.#
19360 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
19370 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
19380 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
19390 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
193a0 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79  .      PgHistory
193b0 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
193c0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
193d0 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ger);.      asse
193e0 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73  rt( !pPg->always
193f0 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20  Rollback );.    
19400 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
19410 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
19420 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
19430 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a  >pStmt );.    }.
19440 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65  #endif.    pPage
19450 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
19460 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
19470 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
19480 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
19490 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
194a0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
194b0 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  he==0 ){.    /* 
194c0 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68  Exit early (with
194d0 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69  out doing the ti
194e0 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c  me-consuming sql
194f0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c  ite3OsSync() cal
19500 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68  ls).    ** if th
19510 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f  ere have been no
19520 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
19530 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
19540 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
19550 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d  ager->needSync==
19560 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 );.    rc = pa
19570 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
19580 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61  pPager);.    pPa
19590 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
195a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
195b0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
195c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
195d0 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  en );.  rc = sql
195e0 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70  ite3pager_sync(p
195f0 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20  Pager, 0, 0);.  
19600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19610 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f  K ){.    goto co
19620 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a  mmit_abort;.  }.
19630 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
19640 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
19650 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
19660 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72  ze = -1;.  retur
19670 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  n rc;..  /* Jump
19680 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e   here if anythin
19690 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72  g goes wrong dur
196a0 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
196b0 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d  rocess..  */.com
196c0 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 73 71 6c  mit_abort:.  sql
196d0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
196e0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ck(pPager);.  re
196f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19700 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63  * Rollback all c
19710 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74  hanges.  The dat
19720 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b  abase falls back
19730 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
19740 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e   mode..** All in
19750 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61  -memory cache pa
19760 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68  ges revert to th
19770 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  eir original dat
19780 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54  a contents..** T
19790 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65  he journal is de
197a0 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  leted..**.** Thi
197b0 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74  s routine cannot
197c0 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d   fail unless som
197d0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
197e0 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
197f0 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20  .** the correct 
19800 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c  locking protocol
19810 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   (SQLITE_PROTOCO
19820 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  L) or unless som
19830 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
19840 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
19850 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
19860 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
19870 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
19880 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
19890 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
198a0 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
198b0 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
198c0 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
198d0 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
198e0 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
198f0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
19900 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
19910 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
19920 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
19930 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
19940 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
19950 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43   TRACE2("ROLLBAC
19960 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
19970 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
19980 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
19990 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28  Hdr *p;.    for(
199a0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
199b0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
199c0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
199d0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
199e0 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77   assert( !p->alw
199f0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
19a00 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72       if( !p->dir
19a10 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ty ){.        as
19a20 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f  sert( !((PgHisto
19a30 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49  ry *)PGHDR_TO_HI
19a40 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e  ST(p, pPager))->
19a50 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20  pOrig );.       
19a60 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69   assert( !((PgHi
19a70 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f  story *)PGHDR_TO
19a80 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29  _HIST(p, pPager)
19a90 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  )->pStmt );.    
19aa0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
19ab0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69      }..      pHi
19ac0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
19ad0 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20  ST(p, pPager);. 
19ae0 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e       if( pHist->
19af0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
19b00 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f   memcpy(PGHDR_TO
19b10 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d  _DATA(p), pHist-
19b20 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e  >pOrig, pPager->
19b30 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
19b40 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42     TRACE3("ROLLB
19b50 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25  ACK-PAGE %d of %
19b60 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50  d\n", p->pgno, P
19b70 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
19b80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
19b90 20 20 20 20 20 20 54 52 41 43 45 33 28 22 50 41        TRACE3("PA
19ba0 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f  GE %d is clean o
19bb0 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f  n %d\n", p->pgno
19bc0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
19bd0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
19be0 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70    clearHistory(p
19bf0 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Hist);.      p->
19c00 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
19c10 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20   p->inJournal = 
19c20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74  0;.      p->inSt
19c30 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  mt = 0;.      p-
19c40 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e  >pPrevStmt = p->
19c50 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a  pNextStmt = 0;..
19c60 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
19c70 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
19c80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
19c90 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54  Reiniter(PGHDR_T
19ca0 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67 65  O_DATA(p), pPage
19cb0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
19cd0 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
19ce0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
19cf0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
19d00 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
19d10 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  e;.    memoryTru
19d20 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
19d30 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49     pPager->stmtI
19d40 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  nUse = 0;.    pP
19d50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
19d60 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
19d70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19d80 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50  ;.  }..  if( !pP
19d90 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
19da0 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75   || !pPager->jou
19db0 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
19dc0 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
19dd0 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
19de0 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
19df0 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74  ze = -1;.    ret
19e00 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
19e10 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
19e20 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d  sk!=0 && pPager-
19e30 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f  >errMask!=PAGER_
19e40 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ERR_FULL ){.    
19e50 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
19e60 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
19e70 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  VE ){.      page
19e80 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
19e90 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  r);.    }.    re
19ea0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
19eb0 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
19ec0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19ed0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
19ee0 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  VED ){.    int r
19ef0 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  c2;.    rc = pag
19f00 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65 28  er_reload_cache(
19f10 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 32  pPager);.    rc2
19f20 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
19f30 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
19f40 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
19f50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
19f60 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  = rc2;.    }.  }
19f70 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70  else{.    rc = p
19f80 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50  ager_playback(pP
19f90 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
19fa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19fb0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
19fc0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
19fd0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
19fe0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
19ff0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20 20  _CORRUPT;.  }.  
1a000 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
1a010 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63   -1;.  return rc
1a020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a030 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64 61  n TRUE if the da
1a040 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6f  tabase file is o
1a050 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e  pened read-only.
1a060 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a    Return FALSE.*
1a070 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  * if the databas
1a080 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79 29  e is (in theory)
1a090 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e   writable..*/.in
1a0a0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 69  t sqlite3pager_i
1a0b0 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72 20  sreadonly(Pager 
1a0c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
1a0d0 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  rn pPager->readO
1a0e0 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  nly;.}../*.** Th
1a0f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1a100 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
1a110 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
1a120 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
1a130 33 70 61 67 65 72 5f 73 74 61 74 73 28 50 61 67  3pager_stats(Pag
1a140 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73  er *pPager){.  s
1a150 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b  tatic int a[11];
1a160 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72  .  a[0] = pPager
1a170 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d  ->nRef;.  a[1] =
1a180 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a   pPager->nPage;.
1a190 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d    a[2] = pPager-
1a1a0 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20  >mxPage;.  a[3] 
1a1b0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
1a1c0 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65  ;.  a[4] = pPage
1a1d0 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d  r->state;.  a[5]
1a1e0 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61   = pPager->errMa
1a1f0 73 6b 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  sk;.#ifdef SQLIT
1a200 45 5f 54 45 53 54 0a 20 20 61 5b 36 5d 20 3d 20  E_TEST.  a[6] = 
1a210 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
1a220 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
1a230 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70  Miss;.  a[8] = p
1a240 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20  Pager->nOvfl;.  
1a250 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[9] = pPager->n
1a260 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20  Read;.  a[10] = 
1a270 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a  pPager->nWrite;.
1a280 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1a290 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  a;.}../*.** Set 
1a2a0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  the statement ro
1a2b0 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a  llback point..**
1a2c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1a2d0 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
1a2e0 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73  d with the trans
1a2f0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61  action journal a
1a300 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20  lready.** open. 
1a310 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   A new statement
1a320 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61   journal is crea
1a330 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20  ted that can be 
1a340 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  used to rollback
1a350 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61  .** changes of a
1a360 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
1a370 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72  and within a lar
1a380 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ger transaction.
1a390 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1a3a0 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
1a3b0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1a3c0 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1a3d0 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
1a3e0 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20  MPNAME_SIZE];.  
1a3f0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1a400 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
1a410 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1a420 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54  dbSize>=0 );.  T
1a430 52 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49  RACE2("STMT-BEGI
1a440 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
1a450 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
1a460 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50   MEMDB ){.    pP
1a470 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1a480 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
1a490 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67  >stmtSize = pPag
1a4a0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
1a4b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1a4c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61  ;.  }.  if( !pPa
1a4d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a4e0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
1a4f0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31  stmtAutoopen = 1
1a500 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1a510 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73  ITE_OK;.  }.  as
1a520 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
1a530 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70  urnalOpen );.  p
1a540 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
1a550 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
1a560 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20  Pager->dbSize/8 
1a570 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61  + 1 );.  if( pPa
1a580 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20  ger->aInStmt==0 
1a590 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
1a5a0 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Lock(&pPager->fd
1a5b0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
1a5c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1a5d0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66  E_NOMEM;.  }.#if
1a5e0 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63  ndef NDEBUG.  rc
1a5f0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
1a600 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
1a610 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74  d, &pPager->stmt
1a620 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
1a630 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
1a640 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
1a650 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
1a660 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72  tJSize == pPager
1a670 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
1a680 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
1a690 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
1a6a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
1a6b0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
1a6c0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
1a6d0 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
1a6e0 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
1a6f0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
1a700 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
1a710 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
1a720 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
1a730 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1a740 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
1a750 6d 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65  mp(zTemp, &pPage
1a760 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66  r->stfd);.    if
1a770 28 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74  ( rc ) goto stmt
1a780 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20  _begin_failed;. 
1a790 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f     pPager->stmtO
1a7a0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  pen = 1;.    pPa
1a7b0 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20  ger->stmtNRec = 
1a7c0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
1a7d0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1a7e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1a7f0 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e  OK;. .stmt_begin
1a800 5f 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70  _failed:.  if( p
1a810 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29  Pager->aInStmt )
1a820 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
1a830 28 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74  (pPager->aInStmt
1a840 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
1a850 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  InStmt = 0;.  }.
1a860 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a870 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73  /*.** Commit a s
1a880 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1a890 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1a8a0 6d 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20  mt_commit(Pager 
1a8b0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a8c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1a8d0 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
1a8e0 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
1a8f0 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f   TRACE2("STMT-CO
1a900 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
1a910 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
1a920 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
1a930 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
1a940 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66  eek(&pPager->stf
1a950 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20  d, 0);.      /* 
1a960 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
1a970 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  e(&pPager->stfd,
1a980 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71   0); */.      sq
1a990 6c 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72  liteFree( pPager
1a9a0 2d 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20  ->aInStmt );.   
1a9b0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
1a9c0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  mt = 0;.    }.  
1a9d0 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
1a9e0 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50  ->pStmt; pPg; pP
1a9f0 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  g=pNext){.      
1aa00 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
1aa10 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73  xtStmt;.      as
1aa20 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d  sert( pPg->inStm
1aa30 74 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  t );.      pPg->
1aa40 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
1aa50 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
1aa60 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1aa70 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
1aa80 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
1aa90 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
1aaa0 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
1aab0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
1aac0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
1aad0 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  ree(pHist->pStmt
1aae0 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  );.        pHist
1aaf0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
1ab00 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1ab10 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20  Pager->stmtNRec 
1ab20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1ab30 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
1ab40 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
1ab50 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  t = 0;.  }.  pPa
1ab60 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65  ger->stmtAutoope
1ab70 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  n = 0;.  return 
1ab80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
1ab90 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73  .** Rollback a s
1aba0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  tatement..*/.int
1abb0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
1abc0 6d 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65  mt_rollback(Page
1abd0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1abe0 74 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67  t rc;.  if( pPag
1abf0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1ac00 0a 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d  .    TRACE2("STM
1ac10 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  T-ROLLBACK %d\n"
1ac20 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1ac30 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  ));.    if( MEMD
1ac40 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72  B ){.      PgHdr
1ac50 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72   *pPg;.      for
1ac60 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1ac70 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  mt; pPg; pPg=pPg
1ac80 2d 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20  ->pNextStmt){.  
1ac90 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
1aca0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
1acb0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
1acc0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
1acd0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
1ace0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
1acf0 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
1ad00 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
1ad10 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
1ad20 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
1ad30 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73   sqliteFree(pHis
1ad40 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  t->pStmt);.     
1ad50 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
1ad60 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1ad70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1ad80 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
1ad90 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
1ada0 3b 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72  ;.      memoryTr
1adb0 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
1adc0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1add0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1ade0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1adf0 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
1ae00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
1ae10 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
1ae20 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67  stmt_commit(pPag
1ae30 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  er);.  }else{.  
1ae40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1ae50 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1ae60 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1ae70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1ae80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1ae90 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
1aea0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1aeb0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1aec0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1aed0 65 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65  er_filename(Page
1aee0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1aef0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69  turn pPager->zFi
1af00 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  lename;.}../*.**
1af10 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65   Return the dire
1af20 63 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74  ctory of the dat
1af30 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63  abase file..*/.c
1af40 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1af50 65 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28  e3pager_dirname(
1af60 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1af70 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1af80 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a  >zDirectory;.}..
1af90 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1afa0 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f   full pathname o
1afb0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1afc0 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
1afd0 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  r *sqlite3pager_
1afe0 6a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65  journalname(Page
1aff0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
1b000 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  turn pPager->zJo
1b010 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urnal;.}../*.** 
1b020 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 66  Return true if f
1b030 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61 72 65  sync() calls are
1b040 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 74 68   disabled for th
1b050 69 73 20 70 61 67 65 72 2e 20 20 52 65 74 75 72  is pager.  Retur
1b060 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73  n FALSE.** if fs
1b070 79 6e 63 28 29 73 20 61 72 65 20 65 78 65 63 75  ync()s are execu
1b080 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f  ted normally..*/
1b090 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1b0a0 72 5f 6e 6f 73 79 6e 63 28 50 61 67 65 72 20 2a  r_nosync(Pager *
1b0b0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
1b0c0 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  n pPager->noSync
1b0d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1b0e0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
1b0f0 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
1b100 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
1b110 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
1b120 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
1b130 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
1b140 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
1b150 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
1b160 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
1b170 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
1b180 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
1b190 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
1b1a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1b1b0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1b1c0 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
1b1d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b1e0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
1b1f0 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
1b200 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
1b210 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
1b220 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1b230 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1b240 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1b250 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1b260 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
1b270 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1b280 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
1b290 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20  .  /* Open page 
1b2a0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1b2b0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1b2c0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1b2d0 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c  r_get(pPager, 1,
1b2e0 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1b2f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1b300 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
1b310 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1b320 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69  rite(pPage);.  i
1b330 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b340 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1b350 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
1b360 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
1b370 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48  te 24. */.  pPgH
1b380 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  dr = DATA_TO_PGH
1b390 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61  DR(pPage);.  cha
1b3a0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
1b3b0 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
1b3c0 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
1b3d0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1b3e0 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1b3f0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1b400 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1b410 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1b420 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73  +;.  store32bits
1b430 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c  (change_counter,
1b440 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20   pPgHdr, 24);.. 
1b450 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1b460 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1b470 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
1b480 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1b490 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b4a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1b4b0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1b4c0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1b4d0 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1b4e0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1b4f0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1b500 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1b510 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1b520 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1b530 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1b540 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1b550 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1b560 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1b570 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1b580 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1b590 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1b5a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1b5b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b5c0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1b5d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1b5e0 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1b5f0 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1b600 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1b610 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1b620 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1b630 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1b640 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1b650 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1b660 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1b670 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1b680 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1b690 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1b6a0 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1b6b0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1b6c0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1b6d0 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1b6e0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1b6f0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1b700 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1b710 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1b720 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  nc() call..**.**
1b730 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1b740 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1b750 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1b760 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1b770 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1b780 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1b790 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1b7a0 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1b7b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1b7c0 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
1b7d0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1b7e0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1b7f0 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1b800 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b810 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42  .  TRACE4("DATAB
1b820 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1b830 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1b840 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1b850 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1b860 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1b870 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1b880 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1b890 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1b8a0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1b8b0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1b8c0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1b8d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1b8e0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1b8f0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1b900 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1b910 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1b920 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1b930 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1b940 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1b950 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1b960 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1b970 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1b980 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b990 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1b9a0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1b9b0 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1b9c0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1b9d0 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1b9e0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1b9f0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1ba00 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1ba10 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1ba20 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1ba30 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1ba40 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1ba50 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1ba60 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1ba70 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1ba80 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1ba90 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1baa0 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1bab0 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1bac0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1bad0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1bae0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1baf0 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1bb00 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1bb10 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1bb20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1bb30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1bb40 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1bb50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1bb60 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1bb70 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1bb80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1bb90 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1bba0 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1bbb0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1bbc0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1bbd0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1bbe0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1bbf0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1bc00 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1bc10 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1bc20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1bc30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1bc40 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76  gno i;.        v
1bc50 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
1bc60 20 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20      int iSkip = 
1bc70 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
1bc80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66  ager);.        f
1bc90 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20  or( i=nTrunc+1; 
1bca0 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  i<=pPager->origD
1bcb0 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20  bSize; i++ ){.  
1bcc0 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70 50          if( !(pP
1bcd0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1bce0 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26 37  [i/8] & (1<<(i&7
1bcf0 29 29 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20  ))) && i!=iSkip 
1bd00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1bd10 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1bd20 5f 67 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  _get(pPager, i, 
1bd30 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  &pPage);.       
1bd40 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1bd50 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1bd60 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1bd70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1bd80 33 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61  3pager_write(pPa
1bd90 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1bda0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1bdb0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ref(pPage);.    
1bdc0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1bdd0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1bde0 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1bdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1be00 7d 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  } .      }.#endi
1be10 66 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69  f.      rc = wri
1be20 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  teMasterJournal(
1be30 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29  pPager, zMaster)
1be40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1be50 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1be60 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
1be70 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
1be80 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1be90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1bea0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1beb0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  exit;.    }..#if
1bec0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1bed0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1bee0 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b  if( nTrunc!=0 ){
1bef0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1bf00 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
1bf10 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63  e(pPager, nTrunc
1bf20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1bf30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1bf40 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1bf50 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
1bf60 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74  * Write all dirt
1bf70 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 64  y pages to the d
1bf80 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
1bf90 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
1bfa0 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
1bfb0 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
1bfc0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
1bfd0 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b  e_pagelist(pPg);
1bfe0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1bff0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1c000 6e 63 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a  nc_exit;..    /*
1c010 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
1c020 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
1c030 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
1c040 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ync ){.      rc 
1c050 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
1c060 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  &pPager->fd, 0);
1c070 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
1c080 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
1c090 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 73  R_SYNCED;.  }..s
1c0a0 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65 74 75  ync_exit:.  retu
1c0b0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
1c0c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1c0d0 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d  TOVACUUM./*.** M
1c0e0 6f 76 65 20 74 68 65 20 70 61 67 65 20 69 64 65  ove the page ide
1c0f0 6e 74 69 66 69 65 64 20 62 79 20 70 44 61 74 61  ntified by pData
1c100 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e   to location pgn
1c110 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 0a  o in the file. .
1c120 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
1c130 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   be no reference
1c140 73 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  s to the current
1c150 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66 20 63   page pgno. If c
1c160 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a 20 70  urrent page.** p
1c170 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
1c180 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  dy in the rollba
1c190 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
1c1a0 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74 68  s not written th
1c1b0 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74 68 69  ere by.** by thi
1c1c0 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65 20 73  s routine. The s
1c1d0 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 74  ame applies to t
1c1e0 68 65 20 70 61 67 65 20 70 44 61 74 61 20 72 65  he page pData re
1c1f0 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74 72 79  fers to on entry
1c200 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74   to.** this rout
1c210 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ine..**.** Refer
1c220 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
1c230 65 20 72 65 66 65 72 65 64 20 74 6f 20 62 79 20  e refered to by 
1c240 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76 61 6c  pData remain val
1c250 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79  id. Updating any
1c260 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73  .** meta-data as
1c270 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 61  sociated with pa
1c280 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e 20 64  ge pData (i.e. d
1c290 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68  ata stored in th
1c2a0 65 20 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a  e nExtra bytes.*
1c2b0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e  * allocated alon
1c2c0 67 20 77 69 74 68 20 74 68 65 20 70 61 67 65 29  g with the page)
1c2d0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
1c2e0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
1c2f0 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72  ller..**.** A tr
1c300 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
1c310 65 20 61 63 74 69 76 65 20 77 68 65 6e 20 74 68  e active when th
1c320 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
1c330 6c 6c 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f  lled. It used to
1c340 20 62 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20   be.** required 
1c350 74 68 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74  that a statement
1c360 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
1c370 20 6e 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74   not active, but
1c380 20 74 68 69 73 20 72 65 73 74 72 69 63 74 69 6f   this restrictio
1c390 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65  n.** has been re
1c3a0 6d 6f 76 65 64 20 28 43 52 45 41 54 45 20 49 4e  moved (CREATE IN
1c3b0 44 45 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76  DEX needs to mov
1c3c0 65 20 61 20 70 61 67 65 20 77 68 65 6e 20 61 20  e a page when a 
1c3d0 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61  statement.** tra
1c3e0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1c3f0 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ve)..*/.int sqli
1c400 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67  te3pager_movepag
1c410 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1c420 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50 67   void *pData, Pg
1c430 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
1c440 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
1c450 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
1c460 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20   PgHdr *pPgOld; 
1c470 0a 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f  .  int h;.  Pgno
1c480 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
1c490 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  0;..  assert( pP
1c4a0 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20  g->nRef>0 );..  
1c4b0 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20  TRACE5("MOVE %d 
1c4c0 70 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e  page %d (needSyn
1c4d0 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25  c=%d) moves to %
1c4e0 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47  d\n", .      PAG
1c4f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1c500 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
1c510 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a  edSync, pgno);..
1c520 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
1c530 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53  ync ){.    needS
1c540 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70  yncPgno = pPg->p
1c550 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28  gno;.    assert(
1c560 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1c570 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c580 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20  Pg->dirty );.   
1c590 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c5a0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d  >needSync );.  }
1c5b0 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50  ..  /* Unlink pP
1c5c0 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
1c5d0 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69  -chain */.  unli
1c5e0 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
1c5f0 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  er, pPg);..  /* 
1c600 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
1c610 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
1c620 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
1c630 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
1c640 2a 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73  ** from it's has
1c650 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69  h chain. Also, i
1c660 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  f the PgHdr.need
1c670 53 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72  Sync was set for
1c680 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f   .  ** page pgno
1c690 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76   before the 'mov
1c6a0 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74  e' operation, it
1c6b0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74   needs to be ret
1c6c0 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20  ained .  ** for 
1c6d0 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74  the page moved t
1c6e0 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  here..  */.  pPg
1c6f0 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  Old = pager_look
1c700 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
1c710 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29  ;.  if( pPgOld )
1c720 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
1c730 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  gOld->nRef==0 );
1c740 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  .    unlinkHashC
1c750 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
1c760 4f 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f 6c 64  Old);.    pPgOld
1c770 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1c780 20 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65   if( pPgOld->nee
1c790 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61  dSync ){.      a
1c7a0 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69  ssert( pPgOld->i
1c7b0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
1c7c0 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1c7d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 1;.      pPg-
1c7e0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
1c7f0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1c800 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
1c810 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1c820 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
1c830 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
1c840 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
1c850 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d  to the new hash-
1c860 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d  chain. */.  pPg-
1c870 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
1c880 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
1c890 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67  gno);.  if( pPag
1c8a0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a  er->aHash[h] ){.
1c8b0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1c8c0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
1c8d0 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
1c8e0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
1c8f0 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
1c900 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
1c910 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
1c920 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
1c930 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
1c940 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70   = pPg;.  pPg->p
1c950 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20  PrevHash = 0;.. 
1c960 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
1c970 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
1c980 43 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66  Cache = 1;..  if
1c990 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
1c9a0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
1c9b0 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
1c9c0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
1c9d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
1c9e0 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
1c9f0 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
1ca00 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
1ca10 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
1ca20 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
1ca30 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
1ca40 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
1ca50 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
1ca60 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
1ca70 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
1ca80 50 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c  Pager.aInJournal
1ca90 20 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65   bit has been se
1caa0 74 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f  t. This needs to
1cab0 20 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20   be remedied by 
1cac0 6c 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74  loading.    ** t
1cad0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
1cae0 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64   pager-cache and
1caf0 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48   setting the PgH
1cb00 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  dr.needSync flag
1cb10 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1cb20 54 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  The sqlite3pager
1cb30 5f 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20  _get() call may 
1cb40 63 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61  cause the journa
1cb50 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61  l to sync. So ma
1cb60 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74  ke.    ** sure t
1cb70 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e  he Pager.needSyn
1cb80 63 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  c flag is set to
1cb90 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  o..    */.    in
1cba0 74 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a  t rc;.    void *
1cbb0 70 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20 61  pNeedSync;.    a
1cbc0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1cbd0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72  eedSync );.    r
1cbe0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1cbf0 5f 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65  _get(pPager, nee
1cc00 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65  dSyncPgno, &pNee
1cc10 64 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28 20  dSync);.    if( 
1cc20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1cc30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70  return rc;.    p
1cc40 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1cc50 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f  = 1;.    DATA_TO
1cc60 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63  _PGHDR(pNeedSync
1cc70 29 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  )->needSync = 1;
1cc80 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1cc90 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69  DR(pNeedSync)->i
1cca0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
1ccb0 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28    DATA_TO_PGHDR(
1ccc0 70 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69 72 74  pNeedSync)->dirt
1ccd0 79 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  y = 1;.    sqlit
1cce0 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4e  e3pager_unref(pN
1ccf0 65 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20  eedSync);.  }.. 
1cd00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1cd10 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
1cd20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1cd30 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
1cd40 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
1cd50 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1cd60 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
1cd70 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
1cd80 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
1cd90 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
1cda0 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
1cdb0 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
1cdc0 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
1cdd0 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
1cde0 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
1cdf0 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
1ce00 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  t sqlite3pager_l
1ce10 6f 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a  ockstate(Pager *
1ce20 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20  pPager){.#ifdef 
1ce30 4f 53 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e  OS_TEST.  return
1ce40 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e   pPager->fd->fd.
1ce50 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a  locktype;.#else.
1ce60 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
1ce70 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65  >fd.locktype;.#e
1ce80 6e 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  ndif.}.#endif..#
1ce90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1cea0 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  UG./*.** Print a
1ceb0 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20   listing of all 
1cec0 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  referenced pages
1ced0 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20 63   and their ref c
1cee0 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ount..*/.void sq
1cef0 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 64 75  lite3pager_refdu
1cf00 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
1cf10 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
1cf20 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
1cf30 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
1cf40 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
1cf50 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
1cf60 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
1cf70 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e;.    sqlite3De
1cf80 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
1cf90 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %3d addr=%p nRef
1cfa0 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
1cfb0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52  pPg->pgno, PGHDR
1cfc0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
1cfd0 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
1cfe0 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
1cff0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
1d000 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.